Проблема с логическим оператором в скрипте bash - PullRequest
1 голос
/ 05 июля 2011

Я прочитал на tldp.com, что

, если [$ condition1] && [$ condition2]

То же самое, что: if [$ condition1 -a $ condition2]

Возвращает true, если оба условия1 и условие2 имеют значение true ... "

, но когда я пытался

if [ $a == 2 ] || [ $b == 4 ]
then
echo "a or b is correct"
else
echo "a and b are not correct"
fi

, это выдает ошибку. Я использую bash.

Ответы [ 4 ]

2 голосов
/ 05 июля 2011

Ваша логика в порядке, но ваши операторы сравнения неверны, вы должны использовать '-eq' для сравнения целых чисел и '==' для строк.См. 'Man test' для быстрого ознакомления, хотя это также задокументировано в 'man bash'.

При использовании целочисленного сравнения всегда лучше инициализировать переменные также равными 0, иначе, если они не установлены, вы получите ошибки.

Как уже упоминалось в c00k, используйте [[вместо [если вы используете bash, поскольку он встроен, поэтому bash не нужно будет выкладываться для использования команды / usr / bin / [.

т.е.

a=0;b=0
# do something else with a or b
if [[ $a -eq 2 ]] || [[ $b -eq 4 ]]
then
    echo "a or b is correct"
else
    echo "a and b are not correct"
fi
1 голос
/ 05 июля 2011

Если вы используете Bash, отбросьте одиночный [ и используйте двойные [[.
Для арифметических операций используйте ((.

Итак, вы хотите написать это:

if (( a == 2 )) || (( b == 4 )); then
    echo "foo"
fi # etc
0 голосов
/ 03 марта 2012

Поправь меня, если я ошибаюсь.&& и ||Сравнение Bash

#!/usr/bin/ksh
set -x    ###### debug mode on 

while :
do
dt=`date '+%M'`

if ([ "$dt" -ge "15"] && [ "$dt" -le "17" ]) || ([ "$dt" -ge "25" ] && [ "$dt" -le "27" ]) 

then

echo "Time-->minutes between 15 to 17 OR 25 to 27"

else

echo "Time--> minutes out of range"
fi

sleep 300 ##### sleep for 5 minutes

done

------------- ниже строки отладочный вывод

+ + date +%M

dt=17

+ [ 17 -ge 15 ]

+ [ 17 -le 17 ]

+ echo Time--> minutes between 15 to 17 OR 25 to 27

Time--> minutes between 15 to 17 OR 25 to 27

+ date

Sat Mar  3 15:17:23 AST 2012

+ sleep 300

>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+ :

+ + date +%M

dt=22

+ [ 22 -ge 15 ]

+ [ 22 -le 17 ]

+ [ 22 -ge 25 ]

+ echo Time--> minutes out of range

Time--> minutes out of range

+ sleep 300

^C$    ######## breaking out of loop(terminating the execution).

$ 
$ env |grep -i shell

+ grep -i shell

+ env

SHELL=/bin/ksh

$ set +x   ##### ending debug mode.
0 голосов
/ 05 июля 2011

Вы присвоили значение a и b?Если нет, то вы должны (в противном случае определенно должны) заключить свои переменные в двойные кавычки:

if [ "$a" == "2" ] || [ "$b" == "4" ]; then
  echo "a or b is correct";
else
  echo "a and b are not correct";
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...