2013-04-08 259 views
0

我正在使用Linux編程遊戲。從shell腳本中的變量運行shell命令

我有shell腳本:

//run.sh  
A="string1" 
B="string2" 
C="string3" 

COMMAND_LINE="python ../file.py \"$A\" \"$B\" --flag1 ../file.txt --flag2 $C" 
echo "$COMMAND_LINE" 
$COMMAND_LINE 

//注意「\」」是故意

我想外殼,由於某種原因,命令不起作用運行 COMMAND_LINE命令,但如果我把已創建並存儲在COMMAND_LINE(這是呼應了字符串)的字符串,並通過shell中運行它,該程序工作正常。

什麼建議?

謝謝

回答

0

COMMAND_LINE中的嵌入引號被視爲文字字符;當$COMMAND_LINE展開時,它們不會引用$A的值。實際上,沒有一種安全的方法可以在POSIX shell中執行一個變量的值作爲命令。

如果您正在使用bash或支持陣列的另一個shell,你可以嘗試

options=(../file.py "$A" "$B" --flag1 ../file.txt --flag2 $C) 
echo "python ${options[@]}" 
python "${options[@]}" 
0

你會幾乎必須使用一個:

eval $COMMAND_LINE 
sh -c "$COMMAND_LINE" 

但總的來說,這是一個充滿危險的過程。如果您負責$COMMAND_LINE(沒有來自用戶的輸入)的完整字符串,並且顯示的值足夠安全。如果用戶可以將自己的shell腳本符號引入任何變量(例如$A,$B$C),那麼您就處於一個受到傷害的世界。