Je mezi těmito dvěma rozdíl?
[[ $a == z* ]]
a
[ $a == z* ]
Mohu mít příklad, kde by měly různé výstupy?
Dále, jak funguje [[ ]] se liší od [ ] ?
Přijatá odpověď:
Rozdíl mezi [[ … ]] a [ … ] je většinou zahrnuta v Proč rozšíření parametrů pomocí mezer bez uvozovek funguje uvnitř dvojitých závorek „[[“, ale ne uvnitř jednoduchých závorek „[“?.
Důležité je, [[ … ]] je speciální syntaxe, zatímco [ je legračně vypadající název pro příkaz. [[ … ]] má speciální pravidla syntaxe pro to, co je uvnitř, [ … ] ne.
S přidaným záhybem zástupného znaku je postup [[ $a == z* ]] se hodnotí:
- Analyzujte příkaz:toto je
[[ … ]]podmíněný konstrukt kolem podmíněného výrazu$a == z*. - Analyzujte podmíněný výraz:toto je
==binární operátor s operandy$aaz*. - Rozbalte první operand na hodnotu proměnné
a. - Vyhodnoťte
==operátor:otestujte, zda je hodnota proměnnéaodpovídá vzoruz*. - Vyhodnoťte podmíněný výraz:jeho výsledek je výsledkem podmíněného operátoru.
- Příkaz je nyní vyhodnocen, jeho stav je 0, pokud byl podmíněný výraz pravdivý, a 1, pokud byl nepravdivý.
Zde je postup [ $a == z* ] se hodnotí:
- Analyzujte příkaz:toto je
[příkaz s argumenty vytvořenými vyhodnocením slov$a,==,z*,]. - Rozbalte
$ado hodnoty proměnnéa. - Proveďte rozdělení slov a generování názvu souboru na parametrech příkazu.
- Pokud je například hodnota
aje 6místný řetězecfoo b*(získáno např.a='foo b*') a seznam souborů v aktuálním adresáři je (bar,baz,qux,zim,zum), pak je výsledkem rozšíření následující seznam slov:[,foo,bar,baz,==,zim,zum,].
- Pokud je například hodnota
- Spusťte příkaz
[s parametry získanými v předchozím kroku.- U výše uvedených vzorových hodnot
[příkaz si stěžuje na chybu syntaxe a vrátí stav 2.
- U výše uvedených vzorových hodnot
Poznámka:V [[ $a == z* ]] , v kroku 3 hodnotu a neprochází dělením slov a generováním názvu souboru, protože je to v kontextu, kde se očekává jedno slovo (levý argument podmíněného operátoru == ). Ve většině případů, pokud jediné slovo dává na této pozici smysl, pak se proměnná expanze chová jako v uvozovkách. Z tohoto pravidla však existuje výjimka:v [[ abc == $a ]] , pokud je hodnota a obsahuje zástupné znaky a poté abc se shoduje se vzorem zástupných znaků. Pokud je například hodnota a je a* pak [[ abc == $a ]] je true (protože zástupný znak * pocházející z nekótované expanze $a odpovídá bc ) zatímco [[ abc == "$a" ]] je false (protože běžný znak * pocházející z citovaného rozšíření $a neodpovídá bc ). Uvnitř [[ … ]] , dvojité uvozovky nehrají žádný rozdíl, kromě pravé strany operátorů shody řetězců (= , == , != a =~ ).