我正在为Linux终端编写一个shell脚本。我希望能够将变量输入到提示符中。例如
test.sh:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
输出:
Enter input: $test
$test
我希望能够在脚本的(读取-p)提示段中输入“$ test”并让脚本在末尾回显“Monkey in the middle ...”而不是回显“$ test”就像现在一样。
我将如何做到这一点?
更新
使用我在this thread提供给我的答案(非常感谢贡献者和评论员!),我设法拼凑出了对我来说非常好的这条线:
newvariable="$(eval echo $input)"
建议,一旦使用eval可能会带来安全风险,我会被警告更多。如果您选择此解决方案,请记住这一点。
答案 0 :(得分:1)
这个问题有几个不同的答案。
如果您实际使用bash
,请查看bash(1)
手册页并阅读参数扩展部分:
如果参数的第一个字符是感叹号 (
!
),它引入了一个变量间接层。 Bash使用 由参数的其余部分形成的变量的值 变量的名称;然后扩展此变量 该值用于替换的其余部分,而不是 参数本身的价值。这被称为间接的 扩张。对此的例外是扩展${!prefix*}
和${!name[@]}
如下所述。感叹号 点必须紧跟左支撑以便 介绍间接。
这意味着如果你有:
read $input
echo "${!input}"
用户输入" HOME
",您将看到$HOME
的值。对于
例如,在我的系统上:
Enter input: HOME
/home/lars
或者,您可以使用eval
命令,该命令应该可以正常工作
在任何类似Bourne-shell的环境中:
eval [arg ...]
args被读取并连接成一个命令。 然后,shell将读取并执行此命令及其退出 status返回为eval的值。如果没有args,或者 只有null参数,eval返回0。
您的代码可能如下所示:
read $input
eval echo "\$$input"
shell将首先扩展$input
的值,以便
结果命令行 - 假设有人输入HOME
响应提示 - 是:
eval echo $HOME
\$
只是使用$
转义\
以便shell
在第一个变量期间,它不会将其解释为变量的开头
通过命令行。
但这里存在问题,请考虑:
Enter input: ;date
$
Sun Feb 14 21:13:33 EST 2016
在这个例子中,分号导致shell执行命令, 这不一定是我们期望或期望的。您可以 通过更好的引用来缓解这种情况:
eval echo \""$input"\"
以上示例中的结果为:
$ sh foo.sh
Enter input: ;date
$;date
但这里的教训是“不要在安全敏感中使用eval
情况"