Как выполнить операцию логического ИЛИ для сравнения целых чисел в скриптах оболочки?
Я пытаюсь выполнить простую проверку условия, но, похоже, это не срабатывает.
Если $#
равен 0
или больше 1
, то нужно вывести "hello".
Я пробовал следующий синтаксис, но безуспешно:
if [ "$#" == 0 -o "$#" > 1 ] ; then
echo "hello"
fi
if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
echo "hello"
fi
Можете подсказать, в чем может быть проблема?
5 ответ(ов)
Это должно работать:
#!/bin/bash
if [ "$#" -eq 0 ] || [ "$#" -gt 1 ]; then
echo "hello"
fi
Я не уверен, будет ли это по-другому в других оболочках, но если вы хотите использовать <
и >
, вам необходимо заключить их в двойные скобки следующим образом:
if (("$#" > 1)); then
...
fi
Обратите внимание, что в Bash для сравнения чисел используются именно такие конструкции.
Этот код работает для меня:
#!/bin/sh
argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
echo "foo"
else
echo "bar"
fi
Не думаю, что sh
поддерживает "==". Для сравнения строк используйте "=", а для сравнения целых чисел - -eq
.
man test
для получения дополнительных сведений.
Если вы используете код выхода bash $? как переменную, лучше сделать так:
if [ $? -eq 4 -o $? -eq 8 ] ; then
echo "..."
fi
Дело в том, что если вы сделаете:
if [ $? -eq 4 ] || [ $? -eq 8 ] ; then
То левая часть оператора OR изменяет значение \(?**, и, следовательно, **правая часть оператора OR** не будет иметь оригинальное значение **\)?. Чтобы избежать этой проблемы, используйте конструкцию с первым вариантом.
При использовании условных операторов в Bash может возникнуть ошибка "too many arguments". Это происходит, если вы не используете двойные квадратные скобки [[ ... ]]
в вашем условии. Двойные скобки позволяют использовать более сложные условия и облегчают работу с строками.
Например, если у вас есть переменная OUTMERGE
, и вы хотите проверить, содержит ли она определенные подстроки (например, "fatal" или "Aborting"), вам нужно использовать [[ ... ]]
следующим образом:
if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]; then
# Ваш код здесь
fi
В этом примере оператор ||
используется для логического 'или', что позволяет проверить несколько условий одновременно. Использование двойных скобок также защищает от ошибок, связанных с пробелами и специальными символами в строках. Поэтому при возникновении ошибки "too many arguments" убедитесь, что вы используете правильный синтаксис с двойными квадратными скобками.
Когда вы используете условие в bash скрипте с оператором -gt
(больше) и -lt
(меньше), вы проверяете, находится ли значение переменной $input
за пределами некоторого числа number
. Если либо одно, либо оба условия истинны, будет выполнен блок после then
. В противном случае, выполнится блок else
.
Пример кода можно переписать так:
if [[ $input -gt number || $input -lt number ]]
then
echo "Значение $input меньше или больше, чем $number."
else
echo "Значение $input равно $number."
fi
exit
Таким образом, если переменная $input
меньше или больше number
, будет выведено первое сообщение. Если же они равны, будет выведено другое сообщение. Не забудьте перед использованием переменных убедиться, что они инициализированы и имеют корректные числовые значения, чтобы избежать неожиданных результатов.
Разница между sh и Bash
Как выводить команды оболочки по мере их выполнения
Как проверить статус завершения с помощью оператора 'if'
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?