shell 字元串比較與腳本 too many arguments 報錯
- 2019 年 11 月 10 日
- 筆記
一、問題
最近在寫 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