Це питання є продовженням свого роду попереднє запитання . Користувачі на цьому сайті люб’язно допомогли мені визначити, як написати 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 ]]це безпечно.