我写了一个简单的脚本。
read -p "Enter the path: " path
echo "$path"
我将输入指定为
$HOME
输出是:
$HOME
如果我写
echo "$HOME"
输出
/home/sam
那么为什么不在前一种情况下呢?
答案1
path
成为细绳 $PATH
,而不是它的“解释”。这种解释仅发生在特定的上下文中 - 例如,如果您在交互式 shell 命令提示符下键入“bare”;但绝对不是 in read
(否则你无法用来read
读取包含的文本文件$
,例如!)。
记住,扩张是一个您永远不想在任何地方启用的功能 - 它会使编写将变量作为变量而不是其内容传递的程序变得困难。因此,编程语言设计者(或者就 shell 而言,数十年或多或少的有机开发)决定在哪里进行扩展,在哪里不进行扩展。这里并没有真正的“为什么”:这就是它的定义方式。
如果你愿意的话你可以eval value="$path"
,然后你就得到了。我不建议这样做,因为它基本上使您的输入成为 shell 提示符,如果用户输入,例如,$(rm -rf /)
这将允许他们删除所有内容......
总而言之,我认为这更多的是一个软件设计问题:你想让用户做什么样的事情?
在这种情况下,$HOME
可能几乎是您想要允许的唯一“特殊”情况。我建议将其替换为~
,因为它是规范的缩写形式,然后执行以下操作:
read "Enter foo bar baz:" raw_path
if [[ ( ! -d "${raw_path}" ) && "${raw_path:0:1}" = "~" ]]; then
_path="${HOME}${raw_path:1:}"
else
_path="${raw_path}"
fi