Bash

為什麼我們不能比較。(點)作為 if 語句圓括號內的字元串值?

  • April 4, 2020

問題

我必須將字元串“problem1.sh”與其自身進行比較。在我使用方括號進行比較的情況下solution1.sh (如下所示) ,它可以正常工作。但是,在我使用圓括號的情況下solution2.sh (如下所示),它不起作用。它顯示了上述錯誤*(如下所示)*。

我試過什麼?

我試圖從這里這裡了解 bash 腳本中方括號和圓括號的使用之間的區別。我知道這((expression))是用於比較算術值,而不是用於字元串值。

那麼,是什麼造成了問題呢?

如果我從字元串“problem1.sh”中刪除子字元串“.sh”並使用相同的語句進行比較if (("problem1" == "problem1")),它工作正常。但是,當我只添加“。”時 在字元串中,它會產生問題。即使我刪除了除“。”之外的所有內容。從字元串並使用語句if (("." == ".")),它向我顯示錯誤。

然後,我的問題

如果該語句if (("problem1" == "problem1"))可以正常工作*(可能對英文字母的每個字母都可以正常工作)*,為什麼“。” 字元串創建問題?我的意思是,為什麼我們不能比較“。” if (("." == "."))當我們可以使用相同的表達式(例如)比較字母時,在 bash 腳本的 if 語句中使用圓括號(例如if (("findError" == "findError")))?

solution1.sh

if [ "problem1.sh" == "problem1.sh" ]
then
       printf "Okay"   
fi

solution2.sh

if (( "problem1.sh" == "problem1.sh" ))
then
       printf "Okay"   
fi

solution2.sh 的錯誤消息

./solution2.sh: line 1: ((: problem1.sh == problem1.sh : syntax error:
   invalid arithmetic operator (error token is ".sh == problem1.sh ")

語言翻譯存在問題。

在算術表達式語言中,點不存在。

您使用的語言不能在“$((…))”中工作。

在 “$((…))” (一個算術表達式)內只能有數字(通常是整數,如1234)、運算符(+-*<<yes==作為相等運算符等)和變數(一個或多個字母、數字不是第一個字元)和下劃線)。就這樣。沒有字元串的概念。

當您problem1在算術表達式中編寫時,該語言將其理解為變數名(如果先前未定義,則值為 0):

$ echo "==$((problem1))=="
==0==

$ problem1=34
$ echo "==$((problem1))=="
==34==

文本是否在引號內並不重要:

$ echo "==$(("problem1"))=="
==34==

您正在使用的((…))也是一個算術表達式,恰好沒有輸出。它只是設置退出狀態(和在 C 中一樣,如果表達式的結果不是 0則為真)。

$ (( 1 + 1 ))  ; echo "$?"
0
$ (( 0 ))      ; echo "$?"
1
$ (( 1 - 10 )) ; echo "$?"
0

但是算術表達式不理解點是什麼,既不能作為運算符也不能作為變數名,因此會產生語法錯誤:

$ echo "$(( 1.3 ))"
bash: 1.3 : syntax error: invalid arithmetic operator (error token is ".3 ")

這同樣適用於變數名 ( problem1) 後跟一個點和另一個變數名 ( sh)。

$ echo "$((problem1.sh))"
bash: problem1.sh: syntax error: invalid arithmetic operator (error token is ".sh")

如果運算符是 a+而不是點,則表達式將起作用:

$ echo "$((problem1+sh))"
34

如果problem1已設置為 34(如上)。

因此,比較字元串的唯一方法是使用[[…]]

$ [[ problem1.sh == problem1.sh ]] && echo YES
YES

(在這種特殊情況下不引用右側,==因為沒有變數擴展並且字元串沒有全域字元,但一般來說,請在右側引用字元串==)。

或者,類似於你寫的:

if       [[ "problem1.sh" == "problem1.sh" ]]
then     printf "Okay"   
fi

引用自:https://unix.stackexchange.com/questions/552651