Rozwiń testy
Zasadniczo powłoka jest rodzajem języka makro, a przynajmniej hybrydą lub jakimś innym. Każdy wiersz poleceń można zasadniczo podzielić na dwie części: część parsującą / wejściową i część rozwijającą / wyjściową.
Pierwsza część jest tym, na czym skupia się większość ludzi, ponieważ jest najprostsza: widzisz, co dostajesz. Druga część jest tym, czego wielu nigdy nie próbuje nawet bardzo dobrze zrozumieć i dlatego ludzie mówią, że rzeczy takie eval
są złe i zawsze cytują twoje rozszerzenia - ludzie chcą, aby wynik pierwszej części był równy pierwszej. To w porządku - ale prowadzi to do niepotrzebnie długich gałęzi kodu i mnóstwa zewnętrznych testów.
Rozszerzenia są autotestem . Te ${param[[:]#%+-=?]word}
formy są bardziej niż wystarczające, aby potwierdzić zawartość parametru, są przystosowane do gniazdowania, i są oparte wokół oceny dla NUL - czyli to, co większość ludzi oczekuje testów anyway. +
może być szczególnie przydatny w pętlach:
r()while IFS= read -r r&&"${r:+set}" -- "$@" "${r:=$*}";do :;done 2>&-
IFS=x
printf %s\\n some lines\ of input here '' some more|{ r;echo "$r"; }
somexlines ofxinputxhere
... podczas gdy read
ciągnie się niepuste linie, "${r:+set}"
rozszerza się "set"
i pozycjonuje się $r
. Ale gdy pusty wiersz jest read
, $r
jest pusty i "${r:+set}"
rozwija się do ""
- co jest niepoprawnym poleceniem. Ale ponieważ wiersza polecenia jest rozwinięty przed""
zerowy komenda jest poszukiwany, "${r:=$*}"
przyjmuje wartości wszystkich positionals łączone na pierwszy bajt w $IFS
również. r()
może zostać wywołany ponownie w |{
poleceniu złożonym ;}
z inną wartością, $IFS
aby uzyskać następny akapit wejściowy, ponieważ nielegalne jest, aby powłoka read
buforowała poza kolejną \n
ewline na wejściu.
sh
powłoka i jaka powłoka pozwala na tęfor
składnię? jest to wyraźnie dozwolone wzsh
.