Этот вопрос является своего рода продолжением моего предыдущего вопроса . Пользователи на этом сайте любезно помогли мне определить, как написать for
цикл bash, который перебирает строковые значения. Например, предположим, что переменная управления цикла fname
перебирает строки "a.txt" "b.txt" "c.txt"
. Я хотел бы echo
"да!" когда fname
имеет значение "a.txt"
или "c.txt"
, и echo
"нет!" в противном случае. Я пробовал следующий скрипт оболочки 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
Я получаю вывод:
a.txt
нет!
b.txt
нет!
c.txt
да!
Почему if
утверждение очевидно дает истину, когда fname
имеет значение "a.txt"
? Я |
неправильно использовал ?
bash
shell-script
Андрей
источник
источник
-o
в том же[ ]
.||
и отдельно[ ]
над-o
портативность просто потому , что[
не гарантирует поддержку более чем 4 аргумента. Конечно , если целевой языкbash
, никто не должен использовать в[
любом случае , потому чтоbash
«s[[
превосходит во многих отношениях.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
а неif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?bash
, как вы уже делаете. Одним из преимуществ[[
является то, что он не выполняет разбиение слов (особый случай), поэтому[[ $unquoted_var = string ]]
является безопасным.Ответы:
Если вы хотите сказать,
OR
используйте двойную трубу (||
).(Исходный код OP, использующийся,
|
просто передавал выходные данные с левой стороны на правую сторону, точно так же, как любая обычная труба работает.)источник
||
не выполняет стандартную логику «ИЛИ» - она замыкает накоротко, а вторая команда запускается только в случае сбоя первой.OR
если первое условие оценивается как истинное.==
но увидев этот ответ, я решил посмотреть его. Видимо, «это можно использовать, но не стандартно». Я подумал, чтоtest
man рекомендует тожеif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(если вы хотите или должны иметь дополнительную функциональность, связанную с[[ ]]
).