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$a
az*
. - Rozbalte první operand na hodnotu proměnné
a
. - Vyhodnoťte
==
operátor:otestujte, zda je hodnota proměnnéa
odpoví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
$a
do hodnoty proměnnéa
. - Proveďte rozdělení slov a generování názvu souboru na parametrech příkazu.
- Pokud je například hodnota
a
je 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 =~
).