Diese Frage ist eine Art Fortsetzung meiner früheren Frage . Die Benutzer auf dieser Site haben mir freundlicherweise dabei geholfen, herauszufinden, wie eine Bash- for
Schleife geschrieben wird, die Zeichenfolgenwerte durchläuft. Angenommen, eine Schleifensteuerungsvariable fname
durchläuft die Zeichenfolgen "a.txt" "b.txt" "c.txt"
. Ich würde gerne echo
"Ja!" wann fname
hat der Wert "a.txt"
oder "c.txt"
und echo
"nein!" Andernfalls. Ich habe das folgende Bash-Shell-Skript ausprobiert:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Ich erhalte die Ausgabe:
a.txt
Nein!
b.txt
Nein!
c.txt
Ja!
Warum ist die if
Aussage anscheinend wahr, wenn fname
sie den Wert hat "a.txt"
? Habe ich |
falsch benutzt?
bash
shell-script
Andrew
quelle
quelle
-o
innerhalb desselben verwenden[ ]
.||
und trennen[ ]
über-o
einfach für Portabilität , weil[
nicht gewährleistet ist, um mehr als 4 Argumente zu unterstützen. Natürlich, wenn die Zielsprache istbash
, sollte niemand[
sowieso verwenden, weilbash
's[[
in vielerlei Hinsicht überlegen ist.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
eher verwenden sollte alsif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?bash
, wie Sie es bereits tun. Ein Vorteil von[[
ist, dass es keine Worttrennung (Sonderfall) macht, also[[ $unquoted_var = string ]]
sicher ist.Antworten:
Wenn du sagen willst,
OR
benutze double pipe (||
).(Der ursprüngliche OP-Code, der verwendet
|
wurde, leitete einfach den Ausgang der linken Seite zur rechten Seite, auf die gleiche Weise, wie jede gewöhnliche Pipe funktioniert.)quelle
||
keine Standardlogik "ODER" ausgeführt - es wird kurzgeschlossen, und der zweite Befehl wird nur ausgeführt, wenn der erste fehlschlägt.OR
zu bewerten, wenn die erste Bedingung wahr ist.==
aber nachdem ich diese Antwort gesehen hatte, beschloss ich, nachzuschlagen. Anscheinend "kann es verwendet werden, ist aber nicht Standard". Ich dachte, ich würde dies für andere hier setzen, wenn Sie neugierig sind: stackoverflow.com/a/2237103test
Manpage auch empfiehltif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(wenn Sie zusätzliche Funktionen benötigen oder möchten[[ ]]
).