<Попередній | зміст | Наступна>
Непередбачувані розширення
Можливі помилки, які лише періодично виникають у сценарії. Іноді сценарій буде працювати нормально, а іноді він зазнає невдачі через результати розширення. Якщо ми повернемо нашу пропущену крапку з комою та змінимо значення номер до порожньої змінної ми
може продемонструвати:
#! / бін / баш
# проблема: скрипт для демонстрації поширених помилок
число=
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
#! / бін / баш
# проблема: скрипт для демонстрації поширених помилок
число=
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
Запуск сценарію з цією зміною призводить до виходу:
[me@linuxbox ~]$ біда
/home/me/bin/trouble: рядок 7: [: =: очікуваний унарний оператор Число не дорівнює 1.
[me@linuxbox ~]$ біда
/home/me/bin/trouble: рядок 7: [: =: очікуваний унарний оператор Число не дорівнює 1.
Ми отримуємо це досить загадкове повідомлення про помилку, за яким слідує другий вихід нудьгувати команда. Проблема полягає в розширенні номер змінна всередині тест наказ. Коли команда:
[ $число = 1 ]
[ $число = 1 ]
зазнає розширення с номер будучи порожнім, результат такий:
[ = 1 ]
[ = 1 ]
який є недійсним і генерується помилка. The = оператор є двійковим оператором (він вимагає значення з кожного боку), але перше значення відсутнє, тому тест команда очікує унарного оператора (наприклад -z) замість цього. Далі, оскільки тест не вдалося (через помилку), the if команда отримує ненульовий код виходу і діє відповідно, а друга нудьгувати команда виконується.
Цю проблему можна виправити, додавши лапки навколо першого аргументу в тест
команда:
[ "$number" = 1 ]
[ "$number" = 1 ]
Тоді, коли відбудеться розширення, результат буде таким:
[ "" = 1 ]
[ "" = 1 ]
що дає правильну кількість аргументів. На додаток до порожніх рядків, лапки слід використовувати в тих випадках, коли значення може розгорнутися в рядки з кількох слів, як у випадку з іменами файлів, які містять вбудовані пробіли.