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.