Це питання є продовженням свого роду попереднє запитання . Користувачі на цьому сайті люб’язно допомогли мені визначити, як написати for
цикл bash, який повторюється над значеннями рядка. Наприклад, припустимо, що змінна керування циклом перетворюється fname
на рядки "a.txt" "b.txt" "c.txt"
. Я хотів би echo
"так!" коли fname
має значення "a.txt"
або "c.txt"
, і echo
"ні!" інакше. Я спробував такий сценарій bash shell:
#!/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"
? Я |
неправильно користувався?
-o
в межах одного [ ]
.
||
і розділити [ ]
їх -o
на портативність просто тому [
, що не гарантовано підтримувати більше 4 аргументів. Звичайно , якщо мову перекладу bash
, ніхто не повинен використовувати в [
будь-якому випадку , тому що bash
«s [[
перевершує у багатьох відношеннях.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
а не if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?
bash
, як ти вже робиш. Однією з переваг [[
є те, що він не робить розділення слів (особливий випадок), тому [[ $unquoted_var = string ]]
це безпечно.