bash脚本中的逻辑运算符问题

时间:2011-07-05 13:06:30

标签: bash unix

我在tldp.com上读到了

  

if [$ condition1]&& [$ condition2]

     

相同:if [$ condition1 -a $ condition2]

     

如果condition1和condition2都为true,则返回true ...“

但是当我尝试

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

它给出了错误。我正在使用bash。

4 个答案:

答案 0 :(得分:2)

你的逻辑没问题,但你的比较运算符是不正确的,你应该使用'-eq'来比较整数,'=='用于字符串。请参阅'man test'以获得快速参考,尽管它也记录在'man bash'中。

使用整数比较时,最好将变量初始化为0,否则如果它们未设置,则会出现错误。

正如c00k所提到的,使用[[而不是[如果使用bash,因为它是内置的,所以bash不需要shell出来使用/ 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 :(得分:1)

如果您使用 Bash ,请删除单[并使用双[[
对于算术运算,请使用((

所以你想写这个:

if (( a == 2 )) || (( b == 4 )); then
    echo "foo"
fi # etc

答案 2 :(得分:0)

您是否为ab分配了值?如果不是,你必须(否则你肯定应该)用双引号引用你的变量:

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

答案 3 :(得分:-1)

如果我错了,请纠正我。 &安培;&安培;和||是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.