5

Как выполнить операцию логического ИЛИ для сравнения целых чисел в скриптах оболочки?

13

Я пытаюсь выполнить простую проверку условия, но, похоже, это не срабатывает.

Если $# равен 0 или больше 1, то нужно вывести "hello".

Я пробовал следующий синтаксис, но безуспешно:

if [ "$#" == 0 -o "$#" > 1 ] ; then
 echo "hello"
fi

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
 echo "hello"
fi

Можете подсказать, в чем может быть проблема?

5 ответ(ов)

10

Это должно работать:

#!/bin/bash

if [ "$#" -eq 0 ] || [ "$#" -gt 1 ]; then
    echo "hello"
fi

Я не уверен, будет ли это по-другому в других оболочках, но если вы хотите использовать < и >, вам необходимо заключить их в двойные скобки следующим образом:

if (("$#" > 1)); then
    ...
fi

Обратите внимание, что в Bash для сравнения чисел используются именно такие конструкции.

0

Этот код работает для меня:

#!/bin/sh

argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
  echo "foo"
else
  echo "bar"
fi

Не думаю, что sh поддерживает "==". Для сравнения строк используйте "=", а для сравнения целых чисел - -eq.

man test

для получения дополнительных сведений.

0

Если вы используете код выхода bash $? как переменную, лучше сделать так:

if [ $? -eq 4 -o $? -eq 8 ] ; then  
   echo "..."
fi

Дело в том, что если вы сделаете:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then  

То левая часть оператора OR изменяет значение \(?**, и, следовательно, **правая часть оператора OR** не будет иметь оригинальное значение **\)?. Чтобы избежать этой проблемы, используйте конструкцию с первым вариантом.

0

При использовании условных операторов в Bash может возникнуть ошибка "too many arguments". Это происходит, если вы не используете двойные квадратные скобки [[ ... ]] в вашем условии. Двойные скобки позволяют использовать более сложные условия и облегчают работу с строками.

Например, если у вас есть переменная OUTMERGE, и вы хотите проверить, содержит ли она определенные подстроки (например, "fatal" или "Aborting"), вам нужно использовать [[ ... ]] следующим образом:

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]; then
  # Ваш код здесь
fi

В этом примере оператор || используется для логического 'или', что позволяет проверить несколько условий одновременно. Использование двойных скобок также защищает от ошибок, связанных с пробелами и специальными символами в строках. Поэтому при возникновении ошибки "too many arguments" убедитесь, что вы используете правильный синтаксис с двойными квадратными скобками.

0

Когда вы используете условие в 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, будет выведено первое сообщение. Если же они равны, будет выведено другое сообщение. Не забудьте перед использованием переменных убедиться, что они инициализированы и имеют корректные числовые значения, чтобы избежать неожиданных результатов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь