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?
-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 ist bash
, sollte niemand [
sowieso verwenden, weil bash
's [[
in vielerlei Hinsicht überlegen ist.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
eher verwenden sollte als if [ "$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.