关于Shell脚本中出现如下 报错[: too many arguments
今天执行shell脚本时出现如下报错。[: too many arguments

先把报错的原由写下:

本来是想判断一个变量是否是空值,谁知又蹦出来一个问题。

[root@k8s-node2 ~]# cat kong.sh 
#!/bin/bash
str="wdadw"
if [ -z "$str" ]; then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong.sh 
Not empty
[root@k8s-node2 ~]# cat kong.sh 
#!/bin/bash
str=""
if [ -z "$str" ]; then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong.sh 
Empty
[root@k8s-node2 ~]# 

也可以采用下面这样的方法判断是否为空值。

[root@k8s-node2 ~]# cat kong1.sh 
#!/bin/bash
str=""
if [ ! "$str" ]; then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong1.sh 
Empty
[root@k8s-node2 ~]# 
[root@k8s-node2 ~]# cat kong1.sh 
#!/bin/bash
str="wwwww"
if [ ! "$str" ]; then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong1.sh 
Not empty
[root@k8s-node2 ~]# 

当然还可以采用如下方法:

[root@k8s-node2 ~]# cat  kong2.sh 
#!/bin/bash
str="wwwww"
if test -z "$str"
then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong2.sh 
Not empty
[root@k8s-node2 ~]# 
[root@k8s-node2 ~]# cat  kong2.sh 
#!/bin/bash
str=""
if test -z "$str"
then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong2.sh 
Empty

等等,还有可以使用 如下方法:

[root@k8s-node2 ~]# cat kong3.sh 
#!/bin/bash
str=""
if [  "$str"=="" ]
then
    echo "Empty"
else
    echo "Not empty"
fi
[root@k8s-node2 ~]# source kong3.sh 
Empty
[root@k8s-node2 ~]# 
然后进入报错的原由:
其实大多数时候,虽然可以不使用括起来字符串和字符串变量的双引号,但这并不是好主意。

就像上面一样,很多时候使用双引号,又有些人不喜欢使用双引号。

为什么呢?因为如果环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。

那么就会报出如下报错:
[: too many arguments

也就是上面题干的报错:




举个例子:

[root@k8s-node1 ~]# cat 222.sh 
#!/bin/bash
HELLO_DOCKER=$(ip a| grep -o scope[[:space:]]global)
if [  !  $HELLO_DOCKER ];then
    echo -e "\033[31mMatching is Failed \n\033[0m"
else
    printf "Matching is Successful \n"
fi
[root@k8s-node1 ~]# source 222.sh 
-bash: [: too many arguments   ###################这里报错了
Matching is Successful 
[root@k8s-node1 ~]# 

从上面的例子可以看出,

如果单单是$HELLO_DOCKER 等于“scope global”,那么一切正常。
可是,“scope global”中却有一个空格,这个的空格迷惑了 bash,bash 扩展 "HELLO_DOCKER" 之后,
代码如下:
[ scope global="scope global" ]

因为环境变量没放在双引号中,所以 bash 认为方括号中的自变量过多。
可以用双引号将字符串自变量括起来消除该问题。


请记住,如果养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。


修改后的代码如下:

[root@k8s-node1 ~]# cat 222.sh 
#!/bin/bash
HELLO_DOCKER=$(ip a| grep -o scope[[:space:]]global)
if [  !  "$HELLO_DOCKER" ];then  ######这里把变量$HELLO_DOCKER 给加上引号,也就是"scope global"
    echo -e "\033[31mMatching is Failed \n\033[0m"
else
    printf "Matching is Successful \n"
fi
[root@k8s-node1 ~]# source 222.sh 
Matching is Successful 
[root@k8s-node1 ~]# 

记得有句话说:如果要扩展环境变量,则必须将它们用 双引号、而不是单引号括起。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐