簡體   English   中英

shell中的命令替換和字段拆分

[英]Command substitution and field splitting in shell

我理解為什么以下命令失敗。

$ a=foo bar
-bash: bar: command not found

它嘗試首先執行a=foo然后執行失敗的bar ,因為沒有名為bar命令。

但我不明白為什么會這樣。 我期待以下命令也失敗。

$ a=$(echo foo bar)
$ echo "$a"
foo bar

根據http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05,首先發生命令替換,然后發生字段拆分。

2.6 Word擴展

本節介紹對單詞執行的各種擴展。 並非所有擴展都在每個單詞上執行,如以下部分所述。

在單個單詞中出現的Tilde擴展,參數擴展,命令替換,算術擴展和引用刪除擴展為單個字段。 只有字段拆分或路徑名擴展才能從單個字創建多個字段。 此規則的唯一例外是在雙引號內擴展特殊參數“@”,如特殊參數中所述。

詞擴展的順序如下:

  1. 應始終執行Tilde擴展(參見Tilde Expansion),參數擴展(參見參數擴展),命令替換(參見命令替換)和算術擴展(參見算術擴展)。 請參見令牌識別中的第5項。

  2. 除非IFS為空,否則應對步驟1生成的字段部分執行字段拆分(請參見字段拆分)。

  3. 除非set -f生效,否則應執行路徑名擴展(請參閱路徑名擴展)。

  4. 報價刪除(參見報價刪除)應始終執行。

所以在命令替換后,

a=$(echo foo bar)

a=foo bar

然后在字段拆分后,首先執行a=foo ,然后執行bar ,然后我們應該有相同的錯誤,即bar: command not found 為什么a=$(echo foo bar)工作正常呢?

答案是2.9.1簡單命令我相信。

具體點1和4:

1.根據Shell語法規則識別為變量賦值或重定向的單詞將保存,以便在步驟3和4中進行處理。

4.在分配值之前,應擴展每個變量賦值以進行波形擴展,參數擴展,命令替換,算術擴展和引用刪除。

或者在3.4 Shell參數中的bash參考手冊中:

可以通過表單的語句分配變量

名稱= [值]

如果未給出值,則為變量分配空字符串。 所有值都經過波形擴展,參數和變量擴展,命令替換,算術擴展和報價刪除(詳見下文)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM