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

運行正常。

問題原因

問題是有空格導致的。但是經過我們的測試,發現,形如 adadad,這種單單前後有空格的,是不會報錯的,但是像 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