
這是我的 bash 腳本小片段。
i=5
command='echo $i'
$command
我希望這個腳本打印5
ie,我希望它運行 echo 並打印 5 $i
。那我該如何解決這個問題呢?
答案1
那將是:
eval "$command"
如果您希望將 的內容$command
評估為 shell 程式碼。
如果你不能保證$command
不會開始-
(這會導致eval
在某些 shell 中將bash
其視為一個選項),你可能需要執行:
eval " $command"
反而。額外的前導空格不會影響命令的解析方式,並且$command
如果eval
它以-
.eval -- "$command"
也可以在某些 shell(包括bash
)中工作,但不是 POSIX (IIRC),並且不能在dash
Bourne shell 中工作。
請注意,您$command
可能應該是:
command='echo "$i"'
除非你確實打算$i
採用 split+glob
將程式碼儲存在“變數”中的一個可能更好的方法是使用函數:
mycommand() { echo "$i"; }
(使用mycommand
而不是command
,因為它command
已經是現有命令)。
如果$command
是break
// continue
,return
行為將根據 shell 的不同而有所不同。
如果你想$command
儲存一個簡單的指令,這是一個單字列表,其中第一個單字被查找為要以單字列表作為參數執行的命令,您可以使用數組變數:
command=('echo' '$i' "$i")
"${command[@]}"
這將運行echo
、echo
和$i
的內容$i
作為參數。
command='echo $i ;x /* '$i
$command
(預設值為$IFS
)是最沒有意義的。在那裡,$command
將包含一個字串。第一個$i
保留原樣,第二個擴展(如單引號之外),然後該字串將受到 split+glob(因為$command
不在雙引號內)的影響,其結果將導致許多單詞,採取作為一個簡單的指令再次。