2013-07-05 11 views
5

Przykład:

foo() { 
    for i in ${@+"[email protected]"}; do 
     echo $i 
    done 
} 

Rozumiem, że ${parameter+word} powoduje ekspansji word jeśli parameter jest ustawiony. Ale dlaczego nie po prostu użyć for i in "[email protected]"; do? Jestem pewien, że jest jakaś korzyść, ale czy ktoś może dać przykład?

Dzięki!

+0

myślę (ale nie może potwierdzić), że jest to obejście dla niektórych muszli, które nie obsługuje poprawnie '' $ @. – chepner

Odpowiedz

5

Zgodnie z POSIX standard, "[email protected]" powinien rozwinąć się do niczego, jeśli [email protected] nie jest ustawiony. Oryginalna powłoka Bourne rozszerza ją jednak do pojedynczego pustego łańcucha. ${@+"[email protected]"} rozwinie się do niczego, jeśli [email protected] nie zostanie ustawione w żadnej powłoce.

Źródło: http://www.in-ulm.de/~mascheck/various/bourne_args/

+3

Aby wyjaśnić: mechanizm ten był kiedyś konieczny, ale jest to relikt z minionej epoki. –

+0

"Przegrany"? Być może "minione". Nie wiem, dlaczego nie powiedziałem, że jest przestarzały. Jeśli używasz '/ bin/sh' w systemie Solaris 2.8, tego typu rzeczy mogą nadal być konieczne, ale to ma kilka lat. (2008?) –

+0

Dzięki! To wyjaśnia to dla mnie. To było ze skryptu używanego i starego HP-UX, który wyjaśnia potrzebę. – Klaus

-1

gdy [email protected] jest pusty ciąg "", ${@+"[email protected]"} produce nic, ale "[email protected]" produkować "", sprawdź to:

foo() { 
    for i in ${@:+"[email protected]"}; do 
     echo XXX: $i 
    done 
} 

bar() { 
    for i in "[email protected]"; do 
     echo XXX: $i 
    done 
} 

echo foo: 
foo "" 
echo bar: 
bar "" 

foo nie wywołuje echo, ale bar nazywa to

+0

'foo' nie wywołuje' echo', ponieważ użyłeś '$ {@: +" $ @ "}', a nie '$ {@ +" $ @ "}' (dodałeś dwukropek do rozszerzenia). Pomiń dwukropek, a 'foo' zachowuje się tak samo jak pasek. – chepner