bash 变量中的变量

bash variables within variables

我写了一个 bash 脚本来制作一个 "shell" 打印命令执行前后的日期:

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

问题是这个 "shell" 不识别 $x 中的变量,因此例如 echo $PWD 输出 $PWD 而不是当前目录。一个相关的结果是 cd 不起作用。如何fix/work解决这个问题?谢谢。

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

后期编辑:实际上以上并不是解决方案;我需要将 -r 选项添加到 read 命令,以防止过早评估反斜杠序列。此外,在这种情况下,双引号毕竟是多余的(因为 prepass 会将 $x"$x" 扩展为相同的东西,除非 $x 为空,并且 eval不带参数和空字符串做同样的事情),但我认为总是包含引号是安全和良好风格的问题。

如果您只是想打印出之前和之后的日期,您可以在 .bashrc 中使用 PROMPT_COMMAND="$(date)" 来实现。这将在您的命令提示符之前打印出日期(这意味着它在功能上也将在您的命令之后,因为您将在命令完成后得到提示)。它将与您的 PS1 分开一行,但如果您希望它在那里,您可以将其添加到您的 PS1 中。

如果你想输入文字 echo $PWD 并让 x 给出它的值,你可以 eval "$x" 但大多数人会建议不要使用 eval 因为任何人都可以输入任何内容,例如 sudo rm -rf / --no-preserve-root

如果你试图将 x 设置为变量的名称,即 x=PWD,并且你想获得 PWD 的值,你可以执行 ${!x}.这叫做"indirection".