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äblichvar
sein. - 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-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 inbash
(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ält00
, da ' ein Zeichenfolgenvergleich ist.