var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Dlaczego otrzymuję komunikat „oczekiwano warunkowego operatora binarnego”. Szukałem już i. Widzę, że [[]] to stwierdzenie testowe, ale dlaczego by nie działało?
Odpowiedź
- Ty „ponownie brakuje
$
przed var, gdy go wywołasz, tak jak to napisałeś, będzie to dosłownievar
. - Rozważ możliwe luki swojego skryptu podczas korzystania z
[[ ... ]]
lub(( ... ))
razem ze zmiennymi, których nie możesz kontrolować. W Twoim przypadku lepiej byłoby użyć[ "$var" -ne 0 ]
. - Brakuje spacji między
!=
i0
(to jest źródło błędu!) -
!=
to operator porównania ciągów , chociaż może działać w twoim przykładzie, do porównywania liczb całkowitych chcesz użyć-ne
.
Skorzystaj z shellcheck .
Komentarze
- Uwaga t hat
(( var !=0 ))
również by działał tutaj, ale tak jak[[ "$var" -ne 0 ]]
byłby luką umożliwiającą wstrzyknięcie dowolnego polecenia, gdyby charakter danych wyjściowych polecenia jest przechwytywany nie jest pod Twoją kontrolą. - Dziękuję St é phane za swoje spostrzeżenia. Czy uważasz, że
[[ "$var" -ne 0 ]]
jest niebezpieczne? A co z tym samym bez cytatów? Więc co Twoim zdaniem powinno być preferowane? - W
[[ $var -ne 0 ]]
(z cudzysłowami lub bez, cudzysłowy nie są w tym konkretnym przypadku konieczne) lub(( var!=0 ))
, zawartość$var
jest oceniana jako wyrażenie arytmetyczne i mogą się wtedy zdarzyć złe rzeczy .[ "$var" -ne 0 ]
(cudzysłowy są tu konieczne, ponieważ[
to zwykłe polecenie) jest bezpieczne wbash
(ale nie wszystkie inne powłoki), ponieważ$var
jest interpretowane tylko jako dziesiętna liczba całkowita.[ "$var" != 0 ]
(lub[[ $var != 0 ]]
kshism) jest również bezpieczny, ale zwróci wartość true, jeśli$var
zawiera00
, ponieważ ' jest porównanie ciągów.