Wewnątrz funkcji skryptu bash, potrzebuję pracować z argumentami wiersza poleceń skryptu, a także z inną listą argumentów. Tak więc próbuję przekazać dwie listy argumentów do funkcji, problem polega na tym, że argumenty z wieloma słowami zostają podzielone.Przekaż argumenty zawierające wiele słów do funkcji bash.
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"
wywołanie skryptu daje mi
myscript.sh a b 'c d'
a
b
c
d
.
x
y
'z
t'
Ponieważ istnieją dwa wykazy muszą być przekazywane w całości do funkcji, pytanie brzmi, jak iteracyjne elementów poszanowaniem elementy wielu haseł ujęte w pojedyncze cudzysłowy "cd" i "z t"?
Ograniczenie, które mam (patrz poniżej) korzysta z BASH_ARGV, więc muszę przekazać do funkcji tylko jedną listę. Chciałbym jednak lepiej zrozumieć, co się dzieje i co jest potrzebne, aby powyższe działania zostały wykonane.
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'
wywołanie skryptu daje mi
myscript.sh a b 'c d'
c d
b
a
.
x
y
z t
... co jest jak muszę go (z wyjątkiem tej pierwszej listy jest odwrotna, ale to byłoby tolerowane Chyba)
Widzę ... więc przekazujesz przedmioty indywidualnie do funkcji. Wydaje mi się, że jedynym miejscem, w którym bash dzieli ciąg znaków na elementy z zachowaniem cytatów, jest interpretacja wiersza poleceń. – haelix
Charakter przekazywania elementów tablicy jako '" $ {items [@]} "' (w podwójnych cudzysłowach) skutkuje wysłaniem każdego elementu jako '" $ {items [0]} "" $ {items [1] } "" $ {items [2]} ... 'etc ... jeśli przekazałeś go jako' $ {items [@]} ', otrzymasz podział tekstu z elementami zawierającymi białe spacje. –