Как можно провести числовое тестирование в bash? - PullRequest
3 голосов
/ 06 августа 2010

Предположим, у меня есть переменная "x" в bash.Как я могу проверить, если это какое-то число?

Я пытался if x=5; then echo "it is 5"; fi, но это не работает,

, тогда я пытался if x==5; then echo "it is 5"; fi, но это также не работает,

затем я попытался if [x==5]; then echo "it is 5"; fi, но это также не работает,

, затем я попытался if [[x==5]]; then echo "it is 5"; fi, но это также не работает,

, затем я попытался if [[x=5]]; then echo "it is 5"; fi, ноэто также не работает,

, затем я попытался if [x=5]; then echo "it is 5"; fi, но это также не работает,

, затем я попытался if [x -eq 5]; then echo "it is 5"; fi, но это также не работает,

Затем я попытался if [[x -eq 5]]; then echo "it is 5"; fi, и это, наконец, сработало.

Я заблудился.Баш кажется адом.Почему так много способов не сработало?И только последний сделал?

Не может ли bash принять if x==5; then ...; fi синтаксис?

Спасибо, Бода Кидо

Ответы [ 7 ]

2 голосов
/ 06 августа 2010

Bash не может принять синтаксис "если x == 5", чтобы иметь семантику, которую вы хотите, потому что это уже допустимый синтаксис с другим значением. 'если х == 5; затем ...; fi 'в настоящее время устанавливает x в значение' = 5 'и затем выполняет команды, следующие за этим.

Что касается вашего первого вопроса, я советую избегать скобок. Просто сделай

if test "$x" = 5; then
...
fi

Также обратите внимание, что 'if test x = 5' будет всегда быть ложным, поскольку это сравнение буквенной строки 'x' и буквальной строки '5'. Вам нужно использовать $ x, чтобы получить значение переменной.

2 голосов
/ 06 августа 2010

Попробуйте:

if [ "$x" = 5 ]; then echo "it is 5"; fi

Обратите внимание, что [ сама по себе команда; вы можете обнаружить, что в вашей системе она связана с test. Итак, man test говорит вам, как его использовать. В частности, важно поставить пробел после него.

1 голос
/ 07 августа 2010
Синтаксис

sh на самом деле удивительно гибок, и вполне возможно получить нужный вам синтаксис.Например, если вы хотите написать «if x == 5», вам просто нужно понять, что sh вычислит эту строку, вызвав команду с именем «x» с аргументами «==» и «5», иреагировать на значение, возвращаемое этой функцией.Следующее, вероятно, не является хорошей идеей для какого-либо производственного параметра, но может быть полезно понять, как это работает:

#!/bin/sh

declare() {
    eval $1'() {
    case $# in
        0) test $'$1';;
        1) false;;
        *) case $1 in
            =) shift; 
            '$1'=$(expr $*);;
            ==) test "$'$1'" = $2;;
            .=) '$1'="$'$1'$2";;
            +=) '$1'=$(expr $'$1' + $2);;
            -=) '$1'=$(expr $'$1' - $2);;
            *) false;;
        esac
    esac
    }'
}

declare x
x = 5
if x == 4; then echo not printed; fi  
if x == 5; then echo x = $x; fi  # "x = 5"
x += 2;
if x == 5; then echo not printed; fi  
if x == 7; then echo x = $x; fi  # "x = 7"
x = foo
x .= bar
echo x = $x                      # "x = foobar"
x = 4 + 5
echo x = $x                      # "x = 9"

Вывод приведенного выше сценария:

1 голос
/ 06 августа 2010

Переменные в bash должны иметь $ перед ними - if [${x} -eq 5] тоже должно сработать.

0 голосов
/ 06 августа 2010

вы можете использовать case / esac

case "$x" in
 5) echo "x is 5";;
esac
0 голосов
/ 06 августа 2010

Невозможно принять bash, если x == 5;затем ...;fi синтаксис?

В Bash вы можете использовать этот синтаксис, который позволяет опускать знак доллара и избегать использования -eq, поэтому он наиболее близок к тому, что вы хотите использовать:

if (( x == 5 ))

Вы можете даже пропустить пробелы, если предпочитаете:

if ((x==5))
0 голосов
/ 06 августа 2010

Вы можете найти главу 7.1.Тестовые конструкции в Расширенное руководство по написанию сценариев полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...