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ěď
- Vy „re chybí
$před var, když jej zavoláte, jak jste to napsali, bude to doslovavar. - 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 ]. - Chybí vám mezera mezi
!=a0(toto je zdroj chyby!) -
!=je operátor porovnání řetězců , i když by to ve vašem příkladu mohlo fungovat, chcete použít-nek 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$varvyhodnocen 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čí vbash(ale ne všechny ostatní skořápky), protože$varje interpretován pouze jako desítkové celé číslo.[ "$var" != 0 ](nebo[[ $var != 0 ]]kshism) je také bezpečný, ale pokud by$varobsahuje00as ' sa porovnání řetězců.