2014-02-25 5 views
0

Я не могу не заметить, что так много кодов оболочки, использующих операторы сравнения, как аргументы команды test, а не знаками.Совместимость с двоичным оператором для оболочки

Например, чтобы проверить, если аргументы не принимаются в оболочке с помощью test:

if test $# -eq 0 
then 
    echo "No arguments received" 
fi 

Почему мы не может заменить -eq с более, скажем, традиционным, интуитивным, знакомым, универсальным, и, читаемым знаком с ==? Так что мы имеем следующее:

if test $# == 0 
then 
    echo "No arguments received" 
fi 

То же самое с другими операторами сравнения < < =>>.

Я предполагаю, что для этого должны быть некоторые технические причины (возможно, проблема совместимости?) В пользу формата -eq за ==, но я не знаю о них.

ответ

3

Прежде всего, используйте $#, а не [email protected].

Техническая причина разницы заключается в том, что операторы определяют, как интерпретируются операнды.

Для <, = и > операнды считаются строками. Это означает, что 10 < 2, потому что 1-что-то приходит до 2-то в алфавите и 1 != 01, потому что строки имеют разную длину.

Для -eq, -gt, -lt, операнды считаются целыми числами. Это означает, что 2 -lt 10, потому что число 2 меньше, чем число 10, и 1 -eq 01, потому что это как численно эквивалентные способы записи 1.

+0

Это именно то, что я искал! Какие еще были бы побочные эффекты использования операторов сравнения строк для целочисленного сравнения? – melvynkim

+1

В основном это - алфавитный и числовой порядок, а целочисленная канонизация. Это особенно актуально в августе, потому что ведущие нули означают восьмеричную нотацию, а 'date +% m' начинает возвращать недопустимый номер' 08'. –

3

Вы можете использовать ((and)) (арифметический процессор) в BASH, который поддерживает все операторы, как ==, >=, <=, <, > и т.д.:

if (($# == 0)) 
then 
    echo "No arguments received" 
fi 

PS: # параметров представлена $#

 Смежные вопросы

  • Нет связанных вопросов^_^