一、問題
最近在寫 shell 腳本的時候,遇到了一些小問題,就是我在判斷一個字符串是否為空的時候經常報下面的錯,程序是正常執行了,但是有這個提示很蛋疼,下面就是看看是什么問題導致的?
[: too many arguments
二、問題解析
原始腳本
我的腳本是這樣寫的
#!/bin/bash
list='1 2 4 ad'
if [ $list -eq '' ]
then
echo "empty"
else
echo "not empty"
fi
運行后
[root@wi-mi-2034 scripts]# bash test.sh
test.sh: line 3: [: too many arguments
not empty
第一個問題: -eq
是用於比較兩個數字的,比較字符串要使用 ==
。
更改版本一 使用 "==" 進行比較
使用 "==" 進行比較,替換 -eq
.
#!/bin/bash
list='1 2 4 ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
運行之后
[root@wi-mi-2034 scripts]# bash test.sh
test.sh: line 3: [: too many arguments
not empty
還是有這個報錯,但是經過我的測試發現,如果我們將 list 值設置為 沒有空格的話,是不會出現這個問題。
更改版本二 使用 "==" 進行比較,更改變量的值
list 原來的值為:1 2 4 ad
更改為 ad
#!/bin/bash
list='ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
運行之后
[root@wi-mi-2034 scripts]# bash test.sh
not empty
運行正常。
問題原因
問題是有空格導致的。但是經過我們的測試,發現,形如 ad
和 ad
和 ad
,這種單單前后有空格的,是不會報錯的,但是像 ad ad
,這種兩個字符直接有空格的話,是會進行報錯的。
三、問題解決
字符串判斷
使用 ==
進行判斷字符串是否相等, 判斷字符串是否為空的話用 -z
或者 -n
== :判斷字符串是否相等
-z :判斷 string 是否是空串
-n :判斷 string 是否是非空串
在進行字符串判斷的時候使用 ""或者 ''.
- '' :單引號不適合在引用變量做比較的時候使用。因為它會讓變量拿不到值。
- "" :適合在任何時候引用,引用變量以及不引用變量都可以使用。
示例:當我們的字符串必須包含空格的時候
#!/bin/bash
list='1 2 4 ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
我們可以在使用變量做比較的時候,在變量外使用雙引號。
#!/bin/bash
list='1 2 4 ad'
if [ "$list" == '' ]
then
echo "empty"
else
echo "not empty"
fi