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