Diese Frage ist eine Art Fortsetzung meiner früheren Frage . Die Benutzer auf dieser Site haben mir freundlicherweise dabei geholfen, herauszufinden, wie eine Bash- forSchleife geschrieben wird, die Zeichenfolgenwerte durchläuft. Angenommen, eine Schleifensteuerungsvariable fnamedurchläuft die Zeichenfolgen "a.txt" "b.txt" "c.txt". Ich würde gerne echo"Ja!" wann fnamehat 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 ifAussage anscheinend wahr, wenn fnamesie den Wert hat "a.txt"? Habe ich |falsch benutzt?
-oinnerhalb desselben verwenden [ ].
||und trennen [ ]über -oeinfach 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.