shell 字符串比較與腳本 too many arguments 報錯


一、問題

最近在寫 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 adad ,這種單單前后有空格的,是不會報錯的,但是像 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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM