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#_}

相关内容