To pytanie jest kontynuacją mojego wcześniejszego pytania . Użytkownicy tej witryny uprzejmie pomogli mi ustalić, jak napisać for
pętlę bash , która będzie iterować po wartościach ciągu. Załóżmy na przykład, że zmienna sterująca pętli fname
iteruje po łańcuchach "a.txt" "b.txt" "c.txt"
. Chciałbym echo
„tak!” kiedy fname
ma 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 if
stwierdzenie najwyraźniej daje wartość prawda, kiedy fname
ma wartość "a.txt"
? Czy użyłem |
nieprawidłowo?
bash
shell-script
Andrzej
źródło
źródło
-o
tego samego[ ]
.||
i oddzielić[ ]
się-o
do przenoszenia po prostu dlatego, że[
nie jest gwarantowana do obsługi więcej niż 4 argumenty. Oczywiście jeśli język docelowy jestbash
, nikt nie powinien być za pomocą[
anyways bobash
„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.Odpowiedzi:
Jeśli chcesz powiedzieć,
OR
użyj podwójnej rury (||
).(Oryginalny kod OP używał
|
po prostu potokowania wyjścia z lewej strony do prawej strony, w taki sam sposób, jak działa zwykły potok.)źródło
||
nie wykonuje standardowej logiki „LUB” - powoduje zwarcie, a drugie polecenie jest uruchamiane tylko w przypadku niepowodzenia pierwszego.OR
jeśli pierwszy warunek jest prawdziwy.==
ale po zobaczeniu tej odpowiedzi postanowiłem to sprawdzić. Najwyraźniej „można go używać, ale nie jest standardem”. Pomyślałem, że umieszczę to tutaj dla innych, jeśli jesteś ciekawy: stackoverflow.com/a/2237103test
też poleca strona manif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(jeśli chcesz lub musisz mieć powiązaną dodatkową funkcjonalność[[ ]]
).