2017-07-18 28 views
1

我寫bash腳本是這樣的:什麼時候應該使用「」在shell測試和echo中引用一個值?

VF_ETH=$(command) 
if [ -n "$VF_ETH" ] ; then 
    echo "ixgbevf eth: "$VF_ETH 
fi 

命令是Linux命令,我的問題是:

  1. $VF_ETH是得到VF_ETH價值,爲什麼要使用""引用它line2在shell測試?
  2. 如果我不使用""來引用它,會測試失敗嗎?
  3. 如果使用""來引用一個值就是把它變成字符串,爲什麼不在line3的echo中使用?

謝謝

回答

2

假設您獲取存儲在VF_ETH變量,其中包含空格的實際命令。現在,如果您使用if [ -n $VF_ETH ]並且在shell擴展該變量時,將會有多個參數到-n,而它只需要一個參數。因此,你可能會得到類似binary operator expected的錯誤。

同樣在echo命令中,它不是隻有一個參數是必需的。因此,即使你不使用雙引號,它也可以工作。

因此,爲了避免它,擴展變量時總是使用雙引號。

另外使用https://www.shellcheck.net/檢查您的腳本,它會給你正確的信息,你的腳本錯誤/不按照標準。

+0

謝謝,你的意思是命令的返回值(也就是$ VF_ETH)可能是幾個標記包含空格,比如「A B C」。那麼我們如果使用$ VF_ETH,它會是「A」? – batmancn

+0

編號'$ VF_ETH'將會是'A B C',但是如果任何命令僅期望1個參數,並且如果您通過'A B C'而沒有雙引號,它們將被視爲3個參數。 – Utsav

+0

爲了說明我的觀點,請嘗試創建一個名爲'A B C'的目錄。首先嚐試'mkdir A B C',然後嘗試'mkdir「A B C」'。你會明白不同之處。 – Utsav

0

爲1和2,如果設置$VF_ETH="x -a -z x"與代碼測試:

if [ -n $VF_ETH ] ; then 
    echo yes 
else 
    echo nope 
fi 

輸出將nope作爲方括號內將擴大到-n x AND -z x(非空和空)。圍繞變量添加引號可以解決這個問題。

  1. Set $VF_ETH="*"。現在,如果您的echo $foo bash將執行通配符擴展,並且echo會輸出當前目錄的內容。
1

你應該命令行參數和內[ ... ]測試中使用總是雙引號的變量,例如:

ls "$var" 
echo "$var" 
[ -f "$var" ] 
test -f "$var" 

在上述所有例子中的命令用於將接收使用和不使用雙引號不同的值,當$var的值以一堆空格開始時包含一些空格。例如:

var=" an apple" 
echo "$var" # prints " an apple" 
echo $var # prints "an apple", without the leading space 

你並不需要引用它們簡單的任務,例如:

a=$var 
a=$var$b 

如果分配包含空格或其他特殊字符,那麼你必須引用,或者轉義那些特殊字符:

a="$var $b" 
a=$var\ $b 
a=$var" "$b 

以上所有內容都是等效的,但第一個可能是最容易閱讀的,因此r ecommended。

你不需要引用從未有不安全的數值特殊變量,例如:

test $? = 0 

如果你不確定,或者沒有信心,那麼一個好的經驗作用是雙引號總是。

相關問題