为什么 $HOME 不在这里扩展 HOME 变量?

为什么 $HOME 不在这里扩展 HOME 变量?

我写了一个简单的脚本。

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

相关内容