Portál AbcLinuxu, 5. května 2025 03:01

Dotaz: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="

10.5.2010 19:10 pavel
Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Přečteno: 729×
Odpovědět | Admin
Dobrý den, dosud používám pro podmínku konstrukci [ ]. Jaký je rozdíl mezi:
[ -n "$foo" ] && [ -z "$foo" ] && echo "huh?"
a
[[ -n "$foo" ]] && [[ -z "$foo" ]] && echo "huh?"
(V druhém případě si nemusím dávat pozor na uvozovky v podmínce.)
Je nějaký rozdíl mezi:
[ "$foo" == "ooo" ] || echo "foo neni ooo"
a
[ "$foo" = "ooo" ] || echo "foo neni ooo"


Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.5.2010 20:06 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Odpovědět | | Sbalit | Link | Blokovat | Admin
help [

[ je to samé jako test. test a [[ se liší.

Pokud to ale řešíte v bashi, tak ten jde nad rámec normy, aby uživatelé mohli používat oba příkazy pokud možno totožně.

10.5.2010 22:23 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Odpovědět | | Sbalit | Link | Blokovat | Admin
[[ a == jsou bashoviny.

[[ funguje podobně jako [.

== umí rozeznat patterny narozdíl od =: [[ "foobar" == "foo*" ]].

[ je normální program v /usr/bin. "if true" a "if [ ..." je z pohledu bashe to samé, spouští se program a kontroluje jeho návratová hodnota. [[ vyřizuje bash interně.

== funguje jen v [[, standardní [ tomu nerozumí.

Pokud používáte výhradně bash, používejte [[ a v něm == nebo = podle toho jestli potřebujete patterny.

[[ umí navíc operátor =~ pro regexpy.
In Ada the typical infinite loop would normally be terminated by detonation.
12.5.2010 11:19 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Aj [ robi bash interne. Hoci na neho existuje aj externa binarka.
If you hold a Unix shell up to your ear, you can you hear the C.
12.5.2010 16:05 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="

Sice je to builtin, ale pořád se chová jako příkaz; oproti tomu [[ ... ]] je jazyková konstrukce. Viz např.

mike@lion:~> x='a b'
mike@lion:~> y='a b'
mike@lion:~> if [[ $x = $y ]]; then echo E; else echo D; fi
E
mike@lion:~> if [ $x = $y ]; then echo E; else echo D; fi
bash: [: příliš mnoho argumentů                                                 
D                                                                             
frEon avatar 12.5.2010 13:19 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Odpovědět | | Sbalit | Link | Blokovat | Admin
pri pouziti [[ ]] nemusis testovanou promennou uzavirat do uvozovek i v pripade, ze promenna obsahuje vic slov oddelenych mezerami. a="~/soubor velky"; [[ -f $a ]] bude fungovat

pri pouziti [[ ]] se neexpanduji jmena souboru: [[ -f /etc/pass* ]] vrati true poze pokud existuje soubor /etc/pass\*, soubor /etc/passwd testu nevyhovi. Naopak [ -f /etc/pass* ] by vratil true, pokud by nasel pouze jeden soubor, ktery testu vyhovi. Pokud by takovych souboru nasel vic, vraci false.

pri pouziti [[ ]] muzes porovnavat delku retezcu pomoci < a > namisto \< a \> jako pri [ ]

pri pouziti [[ ]]] muzes pouzivat && a || misto tradicnich -o a -a

nejake operatory navic, ted nevim z hlavy jake ;-)

pri [[ ]] nemusis escapovat zavorky [[ test1 && (test2 || test3) ]]

bude toho jeste vice, ale kdo si to ma vsechno pamatovat ;-)
Talking about music is like dancing to architecture.
12.5.2010 14:35 pavel
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
Díky za vysvětlení.
frEon avatar 12.5.2010 19:49 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: Bash - rozdíl mezi konstrukcí [[ ]] a [ ], rozdíl mezi "=" a "=="
tesilo me ;-)
Talking about music is like dancing to architecture.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.