Наступний код дає
[: -ge: очікується одинарний оператор
коли
i=0
if [ $i -ge 2 ]
then
#some code
fi
чому?
Наступний код дає
[: -ge: очікується одинарний оператор
коли
i=0
if [ $i -ge 2 ]
then
#some code
fi
чому?
Відповіді:
Ваша проблема виникає через те, що $i
має порожнє значення, коли ваше повідомлення не працює. Завжди цитуйте свої змінні під час порівняння, якщо є найменший шанс, що одна з них може бути порожньою, наприклад:
if [ "$i" -ge 2 ] ; then
...
fi
Це через те, як оболонка поводиться зі змінними. Припустимо оригінальний приклад,
if [ $i -ge 2 ] ; then ...
Перше, що робить оболонка під час виконання конкретного рядка коду, замінює значення $i
, як і функція пошуку та заміни улюбленого редактора . Тож припустимо, що $i
це порожнє або, ще більш наочно, припустимо, що $i
це купа пробілів! Оболонку замінить $i
наступним чином:
if [ -ge 2 ] ; then ...
Тепер, коли заміна змінних зроблена, оболонка проходить із порівнянням і .... не вдається, тому що зліва від неї не видно нічого зрозумілого -gt
. Однак, цитуючи $i
:
if [ "$i" -ge 2 ] ; then ...
стає:
if [ " " -ge 2 ] ; then ...
Оболонка тепер бачить подвійні лапки і знає, що ви насправді порівнюєте чотири пробіли до 2 і будете пропускати if
.
У вас також є можливість вказати значення за замовчуванням для, $i
якщо $i
воно порожнє, як описано нижче:
if [ "${i:-0}" -ge 2 ] ; then ...
Це замінить значення 0, а $i
не $i
є невизначеним. Я все ще підтримую котирування, тому що, знову ж таки, якщо $i
купа пробілів, то вона не вважається невизначеною , вона не буде замінена на 0, і ви знову зіткнетеся з проблемою.
Будь ласка, прочитайте це, коли у вас є час. Оболонка трактується як чорна скринька багатьма, але вона оперує дуже мало і дуже простими правилами - як тільки ви дізнаєтеся, що це за правила (одним із них є те, як змінні працюють в оболонці, як пояснено вище) оболонка буде більше не має для вас секретів.
Мені потрібно додати свої 5 центів. Я бачу, що всі користуються [
або [[
, але варто зазначити, що вони не є частиною синтаксису if.
Для арифметичних порівнянь використовуйте ((...))
замість цього.
((...)) - це арифметична команда, яка повертає статус виходу 0, якщо вираз ненульовий, або 1, якщо вираз дорівнює нулю. Також використовується як синонім "нехай", якщо потрібні побічні ефекти (призначення).
Див.: Арифметична експресія
Ваш сценарій працює чудово. Ви впевнені, що не присвоюєте нічого іншого перед "if" на "i"?
Поширена помилка - також не залишати місця після квадратних дужок та перед ними.