Bash

為什麼在a中使用雙引號[[[] 測試?

  • May 13, 2019

假設我們在 bash 腳本中有 2 個整數:

value1=5
value2=3

那麼為什麼我們需要在測試的情況下使用雙引號呢?例如:

if [[ "$value1" -eq "$value2" ]]

為什麼不只使用以下內容?

if [[ $value1 -eq $value2 ]]

對我來說,雙引號沒有任何意義。

您實際上並不需要這裡的引號。這是使用不帶引號的變數是安全的極少數情況之一。您可以通過以下方式確認set -x

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

正如您在上面看到的,引用和未引用的測試版本被 bash 解析為完全相同的東西。對於zsh支持運算符的任何其他 shell,我認為也是如此[[ ]]

請注意,更便攜的情況並非[ ]如此:

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

[ ]與構造不同,該構造[[ ]]確實需要引用。


一些有用的連結可以了解更多關於何時以及為什麼需要引用:

即使雙引號不是必需的,使用它們的原因是:

  • 良好實踐/習慣:在這種情況下,它們不是必需的,但通常雙引號為了避免意外的分詞。
  • 因為value1andvalue2是可變的,你可能不知道它們包含什麼。否則你可能會問,“為什麼要為變數而不是檢查而煩惱if [[ 5 -eq 3 ]]?或者更進一步,if當你已經知道 5 不等於 3 時,為什麼還要煩惱呢?防禦性通常更好。(這是真的中不會發生分[[詞,但不會發生分詞的情況很少見。再次,請參閱第一點。)

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