Expanze řádky v shellu

Ahmul

Expanze řádky v shellu
« kdy: 23. 11. 2010, 19:41:07 »
Zdravím široké obecenstvo. Poslední dobou se trápím s otázkou, odkud se berou podobné prapodivné testy:
Kód: [Vybrat]
[ "x$PROMENNA" = "xobsah" ] && ...Shell by měl přeci brát prázdný řetězec "" jako zvláštní argument. Ve všech případech by tedy mělo stačit toto
Kód: [Vybrat]
[ "$PROMENNA" = "obsah" ] && ...V případě, že se $PROMENNA vyexpanduje na prázdný řetězec, pak argumenty pro příkaz test budou vypadat následovně
Kód: [Vybrat]
arg0 = "["
arg1 = ""
arg2 = "="
arg3 = "obsah"
arg4 = "]"
Testoval jsem už několik shellů jestli se náhodou nejedná o compatibility issue (dash, ksh, csh) a všechny se chovají správně. Napadlo mě také, že by se mohlo jednat o přehnanou snahu méně zkušených shell programátorů udělat skript bezpečnější, ale na podobný syntax jsem narazil i v některých systémových skriptech v debianu.

Tedy otázka zní: proč by měla být druhá forma špatná, nebo proč je možné občas zahlédnou první formu, prestože je přinejmenším ošklivější?
« Poslední změna: 23. 11. 2010, 20:17:17 od Petr Krčmář »


maestrx

Re: Expanze řádky v shellu
« Odpověď #1 kdy: 23. 11. 2010, 21:01:26 »
Ja osobne se ridim heslem: Nevynalezej co uz predemnou mnoho lidi pouzilo bez problemu. Ikdyz spousta veci nema na prvni podhled jasny duvod, nejaky hacek tam je vzdy zza nejakych podminek zaklubany :) Vice info treba na: http://stackoverflow.com/questions/174119/why-do-shell-script-comparisons-often-use-xvar-xyes

branchman2

Re: Expanze řádky v shellu
« Odpověď #2 kdy: 23. 11. 2010, 21:08:53 »
O compatibility issue na styl dash, ksh, csh sa urcite jednat nebude, lebo to nemusi byt vec shellu, skor by som testoval viac verzii programu test.

Pri implementacii programu test (ktora by nebola podla Unix specifikacie), ktora najskor skusa vyhodnotit prvy argument by sa mohlo stat, ze
Kód: [Vybrat]
PREMENNA=-n a podmienka by davala zle vysledky / pisala o chybach.

Ahmul

Re: Expanze řádky v shellu
« Odpověď #3 kdy: 24. 11. 2010, 19:05:27 »
ooo, osvícení:) díky za nakopnutí:)