Ein Unterschied zwischen [
und [[
ist , dass [
sie nicht arithmetische Auswertung tun , sondern [[
tut:
$ [ "2 + 2" -eq 4 ] && echo yes
bash: [: 2 + 2: integer expression expected
$ [[ "2 + 2" -eq 4 ]] && echo yes
yes
Die zweite Feinheit ist, dass leere Zeichenfolgen überall dort, wo eine arithmetische Auswertung unter bash durchgeführt wird, mit 0 ausgewertet werden. Zum Beispiel:
$ x=""; echo $((0 + x))
0
$ [[ "" -eq 0 ]] && echo yes
yes
Dokumentation
Von man bash
:
Shell-Variablen sind als Operanden zulässig. Die Parametererweiterung wird durchgeführt, bevor der Ausdruck ausgewertet wird. Innerhalb eines Ausdrucks können Shell-Variablen auch nach Namen referenziert werden, ohne die Parametererweiterungssyntax zu verwenden. Eine Shell-Variable, die null oder nicht gesetzt ist, wird bei Verwendung des Namens ohne Verwendung der Parametererweiterungssyntax mit 0 ausgewertet. Der Wert einer Variablen wird als arithmetischer Ausdruck ausgewertet, wenn auf ihn verwiesen wird oder wenn einer Variablen, der das ganzzahlige Attribut mit declare -i zugewiesen wurde, ein Wert zugewiesen wird. Ein Nullwert ergibt 0 . Für eine Shell-Variable muss das Integer-Attribut nicht aktiviert sein, damit es in einem Ausdruck verwendet werden kann. [ Hervorhebung hinzugefügt]
Nebenbei: Sicherheitsprobleme
Beachten Sie, dass die arithmetische Auswertung von bash ein potenzielles Sicherheitsproblem darstellt. Betrachten Sie zum Beispiel:
x='a[$(rm -i *)]'
[[ x -eq 0 ]] && echo yes
Mit der -i
Option ist das oben Genannte sicher, aber die allgemeine Lektion besteht darin, die arithmetische Auswertung von bash nicht mit nicht bereinigten Daten zu verwenden.
Im Gegensatz dazu wird [
keine arithmetische Auswertung durchgeführt, und folglich versucht der Befehl niemals, Dateien zu löschen. Stattdessen wird sicher ein Fehler generiert:
$ x='a[$(rm -i *)]'
$ [ "$x" -eq 0 ] && echo yes
bash: [: a[$(rm -i *)]: integer expression expected
Weitere Informationen zu diesem Thema finden Sie in dieser Antwort .
[[
arithmetische Auswertung, das hat gefehlt. Ich denke, Sie sollten das als obersten Punkt setzenJa, posix test (
[
) konvertiert bei numerischen Vergleichen keine Zeichenfolge in eine Zahl:Es funktionieren jedoch nicht alle Schalen auf die gleiche Weise:
Übliche Problemumgehung
Stellen Sie sicher, dass ein Null- oder Leerwert in 0 konvertiert wird (funktioniert bei den meisten Shells).
Verwenden Sie Arithmetik
Verwenden Sie eine arithmetische Erweiterung (kann auch Werte wie
2+2
in einigen Shells konvertieren (nicht Bindestrich))Verwenden [[
Die Verwendung des
[[
Tests konvertiert die meisten Zeichenfolgen, die zu einer Zahl werden (auch wenn dies nicht gewünscht wird), in Shells, die Folgendes ermöglichen[[
:quelle
[[
dem Ihre Antwort nicht zu berühren scheint, aber immer noch relevante Informationen. Ich bin neugierig , warumksh
Geräte[
auf diese Weise.convert most strings that would become a number
. Das ist der Grund. Was den philosophischen Grund des Programmierers betrifft, der ihn so implementiert hat, sollten Sie ihn fragen. @SergiyKolodyazhnyy