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

注:双括号内,也不能写小数

 

posted on 2019-04-17 08:48  如尘如水  阅读(7558)  评论(0编辑  收藏  举报