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-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čí vbash
(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
obsahuje00
as ' sa porovnání řetězců.