Shell

為什麼 $foo=* 不會導致錯誤?

  • November 30, 2018

我了解到 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 匹配的文件列表。

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