為什麼我們不能比較。(點)作為 if 語句圓括號內的字元串值?
問題
我必須將字元串“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