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 setzen