shell 单括号与双中括号的区别
出现问题代码如下:
#!/bin/bash
#zxl.sh 脚本名
if [ $1 == 1 ]
then
ssh a.a.a.a
else
ssh b.b.b.b
fi
so easy,运行脚本 ./zxl.sh 1 和 ./zxl.sh 2 成功登录了公司服务器和虚拟机。今天登录的时候,却出问题了。
我今天要登录虚拟机,直接 运行 ./zxl.sh ,我没有加参数,反正不是1,其它参数都给我走else 连接,结果提示我:
./zxl.sh: line 2: [: ==: unary operator expected
root@b.b.b.b's password:
我就纳闷了,而且重点在 'if [ $1 == 1 ]' 语句报问题的同时,然后又执行了else语句,输入密码登录成功,但是这影响“市容”啊,改。
问题出现在哪里呢?我首先想到的是 换== 为 -eq,马上否定,再思考一下,我想到shell编程规范,记得用双中括号,更改后,ok。我想知道为什么在没参数时就报错呢,查找了一下, 如下:
如果变量“参数”的值为空,那么就if语句就变成了if [ = 1 ],这不是一个合法的条件。为了避免出现这种情况,我们必须给变量加上引号if [ "$1" == "1" ],这样即使是空变量也提供了合法的测试条件,,if [ " " == "1" ]
新内容补充:
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
row=18 if [[ $row > 18.3 ]];then echo "1" else echo "it is a test" fi if [ ${row} -gt 18.3 ];then echo "3" fi
输出结果:
it is a test
./pingshi.sh: 第 16 行:[: 18.3: 期待整数表达式
说明:
1、当使用上面比较符时,在单括号内,只支持整数
2、 (1) 双方括号提供了字符串比较的高级特性。
(2) 括号中可以定义一些正则表达式来匹配字符串
(3) 注意不是所有的shell都支持双方括号!
双括号中常用的运算符
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。 2、在双括号结构中,所有变量可以不加入:“$”符号前缀。 3、双括号可以进行逻辑运算,四则运算 4、双括号结构 扩展了for,while,if条件测试运算 5、支持多个表达式运算,各个表达式之间用“,”分开
举例:
row=10 if (( $row ** 2 > 18 ));then echo "1" else echo "it is a test" fi
结果:1
注:双括号内,也不能写小数