Ich habe eine Reihe von "Optionen" eines Befehls.
my_array=(option1 option2 option3)
Ich möchte diesen Befehl in einem Bash-Skript aufrufen und die Werte aus dem Array als Optionen verwenden. So command $(some magic here with my_array) "$1"
wird:
command -option1 -option2 -option3 "$1"
Wie kann ich es tun? Ist es möglich?
-
den Anfang jedes Wortes inmy_array
einfügen?Antworten:
Ich würde einen einfachen
bash
Weg bevorzugen :Ein Grund dafür sind die Räume. Zum Beispiel, wenn Sie:
Die
sed
basierten Lösungen transformieren es in-option1 -option2 -with -space -option3
(Länge 5), aber die obigebash
Erweiterung transformiert es in-option1 -option2 with space -option3
(Länge noch 3). Selten, aber manchmal ist das wichtig, zum Beispiel:quelle
somevar=("${my_array[@]/#/-}")
(Beachten Sie die Klammer um den Wert.) Dann natürlich müssen Sie halten es als Array Handhabung , wenn es mit:echo "${somevar[@]}"
. In Bezug auf die Funktionen sind Sie dort zu eingeschränkt durch die Möglichkeiten der Sprache. Sie können ein Array übergeben:somefunc "${my_array[@]/#/-}"
, dann in dir es in haben$@
:function somefunc() { echo "$@"; }
. Dies$@
enthält jedoch auch die anderen Parameter, sofern vorhanden, und keine andere Möglichkeit, das geänderte Array als stdout zurückzugeben.@
als Array-Index benutzt hast ? Ich habe es mit zsh 5.5.1 getestet und den einzigen Unterschied festgestellt, dass zsh jedem Element nur ein Präfix voranstellt, wenn es als geschrieben wird${my_array[@]/#/-}
, während bash es auch für den*
Index ausführt .Ich habe nicht verarbeitet, dass es sich um ein Array handelt, und ich habe an durch Leerzeichen getrennte Zeichenfolgen gedacht. Diese Lösung wird damit funktionieren, aber da es sich um ein Array handelt, sollten Sie die Lösung von manatwork (
@{my_array[@]/#/-}
) verwenden.Das ist nicht schlecht mit
sed
und eine Unterschale. Wie einfach der reguläre Ausdruck ist, hängt davon ab, was Sie für die Optionen garantieren können. Wenn alle Optionen (a-zA-Z0-9
nur) ein "Wort" sind , reicht eine einfache Anfangswortgrenze (\<
) aus:Wenn Ihre Optionen (höchstwahrscheinlich
-
) andere Zeichen enthalten , benötigen Sie etwas Komplexeres:^
Stimmt mit dem Zeilenanfang[ \t]
überein , stimmt mit einem Leerzeichen oder Tab\|
überein , stimmt mit einer Seite (^
oder[ \t]
) überein ,\(
\)
gruppiert (für die\|
) und speichert das Ergebnis,\<
stimmt mit dem Wortanfang überein.\1
Beginnt die Ersetzung damit, dass die erste Übereinstimmung von den parens (\(\)
) beibehalten wird , und-
fügt natürlich den Strich hinzu, den wir benötigen.Diese arbeiten mit gnu sed zusammen, wenn sie nicht mit deiner zusammenarbeiten, lass es mich wissen.
Und wenn Sie dasselbe Produkt mehrmals verwenden, möchten Sie es möglicherweise nur einmal berechnen und speichern:
quelle
gsed
(ich installierte mithomebrew
). Eine andere Sache: Stattdessenecho $my_array
musste ich tunecho ${my_array[@]}
, um alle Gegenstände zu bekommenmy_array
:echo $my_array
gab mir nur das erste Element. Aber danke für die Antwort und die Erklärung des Regex, speziell zum Thema "Wortgrenze", das ist äußerst nützlich. :)[ $(echo x | sed 's/\</y/') == "yx" ] || exit
.quelle