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
- Sie „fehlt
$vor var, wenn Sie es aufrufen, wie Sie es geschrieben haben, wird es buchstäblichvarsein. - 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. - Ihnen fehlt ein Leerzeichen zwischen
!=und0(dies ist die Fehlerquelle!) -
!=ist ein Zeichenfolgenvergleichsoperator . Während dies in Ihrem Beispiel möglicherweise funktioniert, möchten Sie-neverwenden, 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$varwird 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 inbash(aber nicht alle anderen Shells), da$varnur als Dezimalzahl interpretiert wird.[ "$var" != 0 ](oder der[[ $var != 0 ]]kshism) ist ebenfalls sicher, würde aber true zurückgeben, wenn$varenthält00, da ' ein Zeichenfolgenvergleich ist.