Bash
如何在bash中將帶有值的字元串作為命令執行?
這是我的小 bash 腳本片段。
i=5 command='echo $i' $command
我希望這個腳本列印
5
,即,我希望它執行 echo 並列印 5。但它反而繼續列印$i
。那麼我該如何解決這個問題呢?
那將是:
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
則行為會因外殼而異。如果您想
$command
儲存一個簡單的命令,即單詞列表,其中第一個被查找為以單詞列表作為參數執行的命令,您將使用數組變數:command=('echo' '$i' "$i") "${command[@]}"
那將執行,
echo
with和 content of作為參數。echo``$i``$i
command='echo $i ;x /* '$i $command
(預設值為
$IFS
)是最沒有意義的那個。在那裡,$command
將包含一個字元串。第一個$i
保持原樣,第二個擴展(在單引號之外),然後該字元串將受到 split+glob ($command
不在雙引號內),其結果將導致多個單詞,取再次作為一個簡單的命令。