Linux shell脚本:允许用户在输入

时间:2016-02-15 01:20:09

标签: linux bash shell terminal

我正在为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可能会带来安全风险,我会被警告更多。如果您选择此解决方案,请记住这一点。

1 个答案:

答案 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 情况"