bash变量内的变量

时间:2018-07-25 19:27:38

标签: bash shell variables tokenize

我写了一个bash脚本来制作一个“ shell”,在执行命令之前和之后打印日期:

 while true
 do date
 printf "Prompt: "
 read x
 date
 $x        #Solution: this should be eval "$x"
 done

问题在于此“外壳”无法识别$ x中的变量,因此例如echo $PWD输出$PWD而不是当前目录。一个相关的结果是cd不起作用。如何解决/解决这个问题?谢谢。

编辑:已解决。谢谢大家:-)

后期编辑:实际上,上述解决方案并不完全;我需要在-r命令中添加read选项,以防止过早评估反斜杠序列。此外,在这种情况下,双引号毕竟似乎是多余的(因为除非$x为空,并且"$x"之前的$xeval会扩展到同一行)在没有参数的情况下执行的操作与在空字符串中执行的操作一样,但没有参数),但我认为始终将引号包括在内是安全和良好样式的问题。

1 个答案:

答案 0 :(得分:3)

如果您只是想打印出前后的日期,可以使用PROMPT_COMMAND="$(date)"中的.bashrc进行打印。这将在命令提示符之前打印日期(这意味着它在功能上也将在命令之后),因为在命令完成后会出现提示。它与PS1位于单独的一行,但是如果您愿意,可以将其添加到PS1中。

如果您尝试输入文字echo $PWD并让x给出其值,则可以执行eval "$x",但大多数人建议不要使用{{1} },因为任何人都可以输入任何内容,例如eval

如果您尝试将x设置为变量的名称,即sudo rm -rf / --no-preserve-root,并且想要获取x=PWD的值,则可以执行PWD。这称为“间接”。