Próbuję uzyskać cytowane parametry skryptu bash, aby były bezpiecznie odbierane przez zagnieżdżony skrypt. Jakieś pomysły?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Próba:
bash test.sh aaa bbb '"ccc ddd"'
Wynik:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Oczekiwany wynik
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Odpowiedzi:
Zauważ, że konstrukcja "$ @" nie jest specyficzna dla basha i powinna działać z każdą powłoką POSIX (działa przynajmniej z myślnikiem). Zauważ również, że biorąc pod uwagę wyniki, które chcesz, w ogóle nie potrzebujesz dodatkowego poziomu cytowania. IE po prostu wywołaj powyższy skrypt:
źródło
$@
nie jest dostępny wewnątrz funkcji (ponieważ jest nadpisywany przez argumenty funkcji). Próbowałemfoovar="$@"
ifoovar=$@
+"$foovar"
w funkcji i żadna nie działała: - /Chcesz użyć „$ @” (w dolarach w cudzysłowie) do przekazywania parametrów do indeksu dolnego. Tak jak tak ...
ls-color.sh:
Dlaczego .....
Ze strony podręcznika Bash :
Konfigurowanie niektórych skryptów demonstracyjnych ...
"$@"
- quoted-dollar-at to transformacja tożsamości w celu ponownego przekazania argumentów do podpowłoki (w ~ 99% przypadków to właśnie zamierzałeś zrobić):"$*"
- quoted-dollar-star rozbija argumenty w jeden ciąg (~ 1% czasu, w którym faktycznie chcesz to zachowanie, np. w warunkuif [[ -z "$*" ]]; then ...
:):$*
/$@
- bez cudzysłowów, oba formularze usuwają jeden poziom cudzysłowu i interpretują spacje z łańcuchów bazowych, ale ignorują znaki cudzysłowu (prawie zawsze jest to błąd):Jeśli chcesz się trochę zabawić, możesz użyć "$ @", aby zagnieździć rzeczy tak głęboko, jak chcesz, wypychając i zdejmując elementy ze stosu argumentów, jeśli chcesz.
źródło