Bedingter binärer Operator erwartet

var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi 

Warum wird „bedingter binärer Operator erwartet“ angezeigt? Ich habe schon gesucht und. Ich sehe, dass [[]] eine Testanweisung ist, aber warum sollte es nicht funktionieren?

Antwort

  1. Sie „fehlt $ vor var, wenn Sie es aufrufen, wie Sie es geschrieben haben, wird es buchstäblich var sein.
  2. Berücksichtigen Sie mögliche Schwachstellen Ihres Skripts, wenn Sie [[ ... ]] oder (( ... )) zusammen mit Variablen, die Sie nicht steuern können. In Ihrem Fall ist es möglicherweise besser, [ "$var" -ne 0 ] zu verwenden.
  3. Ihnen fehlt ein Leerzeichen zwischen != und 0 (dies ist die Fehlerquelle!)
  4. != ist ein Zeichenfolgenvergleichsoperator . Während dies in Ihrem Beispiel möglicherweise funktioniert, möchten Sie -ne verwenden, um Ganzzahlen zu vergleichen.

Verwenden Sie Shellcheck .

Kommentare

  • Hinweis t hat (( var !=0 )) würde auch hier funktionieren, aber wie [[ "$var" -ne 0 ]] wäre eine Sicherheitsanfälligkeit bezüglich willkürlicher Befehlsinjektion, wenn die Art der Ausgabe des Befehls erfasst wird ist nicht unter Ihrer Kontrolle.
  • Vielen Dank an St é phane für Ihre Erkenntnisse. Halten Sie [[ "$var" -ne 0 ]] für unsicher? Was ist mit dem gleichen ohne Anführungszeichen? Was sollte Ihrer Meinung nach bevorzugt werden?
  • In [[ $var -ne 0 ]] (mit oder ohne Anführungszeichen, wobei die Anführungszeichen in diesem speziellen Fall nicht erforderlich sind) oder (( var!=0 )), der Inhalt von $var wird als arithmetischer Ausdruck ausgewertet und dann können schlechte Dinge passieren . [ "$var" -ne 0 ] (die Anführungszeichen sind hier erforderlich, da [ ein gewöhnlicher Befehl ist) ist in bash (aber nicht alle anderen Shells), da $var nur als Dezimalzahl interpretiert wird. [ "$var" != 0 ] (oder der [[ $var != 0 ]] kshism) ist ebenfalls sicher, würde aber true zurückgeben, wenn $var enthält 00, da ' ein Zeichenfolgenvergleich ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.