Očekává se podmíněný binární operátor

var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi 

Proč se mi zobrazuje „podmíněný binární operátor očekáván“. Už jsem hledal a. I. vidím, že [[]] je testovací prohlášení, ale proč by to nefungovalo?

Odpověď

  1. Vy „re chybí $ před var, když jej zavoláte, jak jste to napsali, bude to doslova var.
  2. Zvažte možné chyby zabezpečení skriptu při použití [[ ... ]] nebo (( ... )) společně s proměnnými, které nemůžete ovládat. Ve vašem případě by mohlo být lepší použít [ "$var" -ne 0 ].
  3. Chybí vám mezera mezi != a 0 (toto je zdroj chyby!)
  4. != je operátor porovnání řetězců , i když by to ve vašem příkladu mohlo fungovat, chcete použít -ne k porovnání celých čísel.

Využijte shellcheck .

Komentáře

  • Poznámka t fungoval by zde i klobouk (( var !=0 )), ale podobně jako [[ "$var" -ne 0 ]] by byla zranitelnost při injektování libovolného příkazu, pokud by byla povaha výstupu zachyceného příkazu není pod vaší kontrolou.
  • Díky St é phane za vaše postřehy. Považujete [[ "$var" -ne 0 ]] za nebezpečné? A co stejné bez uvozovek? Co by tedy podle vás mělo být upřednostňováno?
  • V [[ $var -ne 0 ]] (s uvozovkami nebo bez nich, v tomto konkrétním případě nejsou uvozovky nutné) nebo (( var!=0 )) je obsah $var vyhodnocen jako aritmetické výrazy a pak se mohou stát špatné věci . [ "$var" -ne 0 ] (uvozovky jsou zde nutné, protože [ je běžný příkaz) je v bezpečí v bash (ale ne všechny ostatní skořápky), protože $var je interpretován pouze jako desítkové celé číslo. [ "$var" != 0 ] (nebo [[ $var != 0 ]] kshism) je také bezpečný, ale pokud by $var obsahuje 00 as ' sa porovnání řetězců.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *