Linux shell 腳本:允許使用者在輸入提示中提供變數名稱

Linux shell 腳本:允許使用者在輸入提示中提供變數名稱

我正在為 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#_}

相關內容