Bash
為什麼在a中使用雙引號[[[] 測試?
假設我們在 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!
[ ]
與構造不同,該構造[[ ]]
確實需要引用。一些有用的連結可以了解更多關於何時以及為什麼需要引用:
即使雙引號不是必需的,使用它們的原因是:
- 良好實踐/習慣:在這種情況下,它們不是必需的,但通常雙引號是為了避免意外的分詞。
- 因為
value1
andvalue2
是可變的,你可能不知道它們包含什麼。否則你可能會問,“為什麼要為變數而不是檢查而煩惱if [[ 5 -eq 3 ]]
?或者更進一步,if
當你已經知道 5 不等於 3 時,為什麼還要煩惱呢?防禦性通常更好。(這是真的中不會發生分[[
詞,但不會發生分詞的情況很少見。再次,請參閱第一點。)