Oczekiwano warunkowego operatora binarnego

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ź

  1. Ty „ponownie brakuje $ przed var, gdy go wywołasz, tak jak to napisałeś, będzie to dosłownie var.
  2. 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 ].
  3. Brakuje spacji między != i 0 (to jest źródło błędu!)
  4. != 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 w bash (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 zawiera 00, ponieważ ' jest porównanie ciągów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *