Bash 中的變數擴展

Bash 中的變數擴展

我嘗試了以下命令

variable='one|name'
echo $variable

輸出是

one|name

echo one|name給了一個錯誤No command 'name' found。這是合理的,因為 bash 將其|視為管道並嘗試將命令name作為one輸入來執行。

但為什麼會echo $variable列印呢one|name?參數和變數展開後,不應該等價於 嗎echo one|name

版本:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)

答案1

不,不應該,因為方式bash 操作命令

當您鍵入 時echo one|namebash解析命令,將其|視為管道令牌,因此|執行管道。

當您鍵入 時echo $variable,由於標記解析發生在變數擴展之前,因此bash將命令解析為兩部分,echo$variable。之後,它執行變數擴展,擴展$variableone|name.在這種情況下,one|name是一個字串,|是字串的一部分,不能被視為管道令牌(當然,令牌識別短語已完成)。如果IFS變數包含|,唯一可以特殊的事情bash將用作|分隔符號來執行欄位拆分:

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name

答案2

原因是因為Bash變數擴展的方式。

不是將變數擴展為 ,而是one|name將變數擴展為"one|name"。因此,這裡由於值括在引號內,因此它們被視為字串而不是命令。

下面是strace命令的輸出,顯示了命令如何擴展。

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000

答案3

引號是您建立的字串的一部分。

如果你這樣做了

variable=one|name
echo $variable

結果將如預期。但您只能在腳本中執行此操作(感謝您的有用評論)。

相關內容