Shell
為什麼 $foo=* 不會導致錯誤?
我了解到 shell 擴展了某些類型的字元。這就是為什麼寫的時候:
$ echo *
我得到一個目錄和文件列表,假設我得到:
Applications Desktop Documents
現在,假設我寫
$ foo=Applications Desktop Documents
我得到:
-bash: Desktop: command not found
很好,但是在寫的時候:
$ foo=*
這行得通,為什麼?我確信 * 應該擴展並給出與上面相同的錯誤。
寫的時候
$ echo ${#foo}
我得到答案 1,這表明 * 已保存到 foo
為什麼 * 在作業中沒有展開?我寫的時候它確實擴大了
$ echo ${foo}
謝謝
在變數賦值期間不會發生路徑名擴展。以下是 bash 手冊頁的摘錄:
如果未給出值,則為變數分配空字元串。所有值都經過波浪號擴展、參數和變數擴展、命令替換、算術擴展和引號刪除(參見下面的擴展)。如果變數具有其整數屬性集,則 value 被評估為算術表達式,即使 $ ((…)) expansion is not used (see Arithmetic Expansion below). Word splitting is not performed, with the exception of " $ @",如下面的特殊參數中所述。不執行路徑名擴展。
當您執行 的賦值時
foo=*
, foo 變數將包含一個文字*
。當您稍後使用變數(不帶引號)時,參數首先擴展為文字*
,然後發生路徑名擴展。*
您可以通過引用參數擴展來驗證它是否包含文字:$ foo=* $ echo "$foo" *
在 bash 中這條規則有一些例外,例如在分配數組時:
$ foo=(*)
在上面的範例中,路徑名擴展立即發生,並且數組包含與 glob 匹配的文件列表。