GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

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í:

  1. Analyzujte příkaz:toto je [[ … ]] podmíněný konstrukt kolem podmíněného výrazu $a == z* .
  2. Analyzujte podmíněný výraz:toto je == binární operátor s operandy $a a z* .
  3. Rozbalte první operand na hodnotu proměnné a .
  4. Vyhodnoťte == operátor:otestujte, zda je hodnota proměnné a odpovídá vzoru z* .
  5. Vyhodnoťte podmíněný výraz:jeho výsledek je výsledkem podmíněného operátoru.
  6. 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í:

  1. Analyzujte příkaz:toto je [ příkaz s argumenty vytvořenými vyhodnocením slov $a , == , z* , ] .
  2. Rozbalte $a do hodnoty proměnné a .
  3. 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ězec foo 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 , ] .
  4. 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.

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 =~ ).

Související:Tisknout odpovídající řádek a n-tý řádek ze shodného řádku?
Linux
  1. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  2. Jaký je rozdíl mezi fsck a e2fsck?

  3. Jaký je rozdíl mezi adduser a useradd?

  1. Jaký je rozdíl mezi InnoDB a MyISAM?

  2. Jaký je rozdíl mezi Sudo Su – a Sudo Su –?

  3. Jaký je rozdíl mezi ls a l?

  1. Rozdíl mezi Getty a Agetty?

  2. Rozdíl mezi .exrc a .vimrc?

  3. Rozdíl mezi „$ . Foo“ A „$ ./foo“??