我正在為 Linux 終端機編寫 shell 腳本。我希望能夠在提示符號下輸入變數名稱。例如:
測試.sh:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
輸出:
Enter input: $test
$test
我希望能夠在read -p
腳本的提示部分輸入“$test”,並讓腳本在末尾回顯“Monkey in the middle...”,而不是像現在那樣回顯“$test”。
我該怎麼做呢?
更新:
使用此處和中提供給我的答案這個線程(非常感謝貢獻者和評論員!),我設法拼湊出這句話,這對我來說非常有效:
newvariable="$(eval echo $input)"
請注意,我不只一次被警告使用 eval 可能會帶來安全風險。如果您選擇此解決方案,請記住這一點。
答案1
代替
echo "$input"
嘗試
eval echo "$input"
它甚至不是特定於 bash 的,適用於 /bin/sh!
請注意,這會帶來嚴重的安全風險,因為它eval
只會執行您提供的內容。在這種情況下,shell 將字串解釋$input
為$test
,然後eval
執行echo $test
。但如果使用者輸入了怎麼辦$test; rm -rf *
? eval
將呈現echo $test; rm -rf *
.如果您這樣做,請務必小心。
答案2
在 bash 中你可以使用間接參數擴展句法:
test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}
在這種情況下,用戶只需提供test
不含美元符號的字串。
答案3
只要您不介意使用者可以透過包含命令替換來執行任意命令$(…)
,您就可以將字串提交給eval
內建函數。請注意,eval
需要一個 shell 片段,如果輸入包含引號,則可能會導致語法錯誤。處理引號的(相對)簡單方法是使用此處文件來執行替換。您仍然受制於未終止的變數或命令替換(例如$(foo
)。
IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}