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ść$varjest 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ż$varjest 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$varzawiera00, ponieważ ' jest porównanie ciągów.