Innerhalb einer Bash-Skriptfunktion muss ich mit den Befehlszeilenargumenten des Skripts und auch mit einer anderen Liste von Argumenten arbeiten. Ich versuche also, zwei Argumentlisten an eine Funktion zu übergeben, das Problem besteht darin, dass Mehrwortargumente aufgeteilt werden.Übergeben von Mehrwortargumenten an eine Bash-Funktion
function params()
{
for PARAM in $1; do
echo "$PARAM"
done
echo .
for ITEM in $2; do
echo "$ITEM"
done
}
PARAMS="[email protected]"
ITEMS="x y 'z t'"
params "$PARAMS" "$ITEMS"
Das Skript gibt mir
myscript.sh a b 'c d'
a
b
c
d
.
x
y
'z
t'
Da es zwei Listen sie als Ganzes an die Funktion übergeben werden muss, ist die Frage, wie die Elemente zu durchlaufen, während Mehrwort-Elemente zu respektieren in den Anführungszeichen "cd" und "z t" eingeschlossen?
Die Problemumgehung, die ich habe (siehe unten) nutzt BASH_ARGV, so dass ich nur eine einzige Liste an die Funktion übergeben muss. Ich würde jedoch gerne ein besseres Verständnis davon bekommen, was vor sich geht und was benötigt wird, um die obige Arbeit zu leisten.
function params()
{
for PARAM in "${BASH_ARGV[@]}"; do
echo "$PARAM"
done
echo .
for ITEM in "[email protected]"; do
echo "$ITEM"
done
}
params x y 'z t'
Das Skript gibt mir
myscript.sh a b 'c d'
c d
b
a
.
x
y
z t
... das ist, wie ich es brauche (außer dass erste Liste umgekehrt wird, aber das wäre erträglich ich denke)
Ich sehe ... so Sie Elemente einzeln an die Funktion übergeben. Scheint mir, dass die einzige Stelle, wo bash eine Zeichenfolge in Elemente unter Berücksichtigung von Anführungszeichen zerlegt, bei der Interpretation einer Befehlszeile ist. – haelix
Die Art der Übergabe der Array-Elemente als "$ {items [@]}" '(in doppelten Anführungszeichen) bewirkt, dass jedes Element als' $ {items [0]} "" $ {items [1] } "" $ {items [2]} ... etc ... Wenn Sie es als '$ {items [@]}' übergeben, erhalten Sie eine Worttrennung mit Elementen, die Leerzeichen enthalten. –