Betrachten Sie zwei bedingte Ausdrücke expr1
und expr2
zum Beispiel $i -eq $j
und $k -eq $l
. Wir können dies auf verschiedene bash
Arten schreiben . Hier sind zwei Möglichkeiten
[[ expr1 || expr2 ]]
[[ expr1 ]] || [[ expr2 ]]
Ich bin mir ziemlich sicher, dass ich hier Empfehlungen gesehen habe, dass die zweite bevorzugt werden sollte, aber ich kann keine Beweise finden, die dies unterstützen.
Hier ist ein Beispielskript, das zu demonstrieren scheint, dass es keinen Unterschied gibt:
for i in 0 1
do
for j in 0 1
do
for k in 0 1
do
for l in 0 1
do
if [[ $i -eq $j || $k -eq $l ]]; then printf "1-yes\t"; else printf "1-no\t"; fi
if [[ $i -eq $j ]] || [[ $k -eq $l ]]; then printf "2-yes\n"; else printf "2-no\n"; fi
done
done
done
done
und Ausgabe, die zeigt, dass beide Bedingungskonstrukte das gleiche Ergebnis erzeugen:
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-no 2-no
1-no 2-no
1-yes 2-yes
1-yes 2-yes
1-no 2-no
1-no 2-no
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
Gibt es einen Vorteil bei der Verwendung eines Konstrukts gegenüber dem anderen?
Für Bonuspunkte dieselbe Frage, aber Verallgemeinerung auf mehrere Bedingungen mit ||
und &&
. Zum Beispiel [[ expr1 && expr2 || expr3 ]]
.
[
odertest
( nicht[[
) suchen Sie nach denOB
Tags (verknüpft mit der "veralteten" Definition) in der POSIX-Spezifikation fürtest
. Intest
einigen pathologischen Fällen kann es unmöglich sein zu sagen, ob(
oder)
soll eine Syntax sein, die für den Testbefehl oder eine zu testende Zeichenfolge von Bedeutung ist. Daher können Personen, die die Veralterungsmarkierungen ignorieren und diese Syntax verwenden, tatsächlich das Gegenteil benötigen. veraltete"x$foo"
Praxis; mit[[
, das ist kein problem.