关于Shell脚本中出现如下 报错[: too many arguments
Posted 抛物线.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Shell脚本中出现如下 报错[: too many arguments相关的知识,希望对你有一定的参考价值。
关于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 ~]#
记得有句话说:如果要扩展环境变量,则必须将它们用 双引号、而不是单引号括起。
以上是关于关于Shell脚本中出现如下 报错[: too many arguments的主要内容,如果未能解决你的问题,请参考以下文章
关于Shell脚本if 报错:[: too many arguments
shell脚本获取时间戳偶尔报错value too great for base
shell脚本报错:-bash:/bin/sh^M: bad interpreter:
Shell脚本报错:-bash: ./switch.sh: /bin/bash^M: bad interpreter: No such file or directory
Linux shell 脚本报错:/bin/bash^M: bad interpreter: No such file or directory