To pytanie jest kontynuacją mojego wcześniejszego pytania . Użytkownicy tej witryny uprzejmie pomogli mi ustalić, jak napisać forpętlę bash , która będzie iterować po wartościach ciągu. Załóżmy na przykład, że zmienna sterująca pętli fnameiteruje po łańcuchach "a.txt" "b.txt" "c.txt". Chciałbym echo„tak!” kiedy fnamema wartość "a.txt"lub "c.txt"i echo„nie!” Inaczej. Próbowałem następującego skryptu powłoki bash:
#!/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
Otrzymuję wynik:
a.txt
Nie!
b.txt
Nie!
c.txt
tak!
Dlaczego ifstwierdzenie najwyraźniej daje wartość prawda, kiedy fnamema wartość "a.txt"? Czy użyłem |nieprawidłowo?
-otego samego [ ].
||i oddzielić [ ]się -odo przenoszenia po prostu dlatego, że [nie jest gwarantowana do obsługi więcej niż 4 argumenty. Oczywiście jeśli język docelowy jest bash, nikt nie powinien być za pomocą [anyways bo bash„s [[jest lepszy pod wieloma względami.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]raczej używać if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?
bash, tak jak już to robisz. Jedną z zalet [[jest to, że nie wykonuje podziału słów (szczególny przypadek), więc [[ $unquoted_var = string ]]jest bezpieczny.