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".
我写了一个 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".