
我嘗試了以下命令
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|name
,bash
解析命令,將其|
視為管道令牌,因此|
執行管道。
當您鍵入 時echo $variable
,由於標記解析發生在變數擴展之前,因此bash
將命令解析為兩部分,echo
和$variable
。之後,它執行變數擴展,擴展$variable
為one|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
結果將如預期。但您只能在腳本中執行此操作(感謝您的有用評論)。