7

我需要在 Bash 脚本中向文件写入参数,所以我正在做这样的事情,

echo "Argument is: $1" >> file

问题是,如果参数中有波浪号 (~),我不希望它扩展到主目录。因此,如果用户将 ~/bin 作为参数传递给脚本,它将被写为 ~/bin 而不是 /home/user/bin。我该怎么做呢?

4

3 回答 3

6

我假设您的程序启动为:

$ your_prog ~/foo

该参数甚至在您的程序启动之前就被翻译了,因此除了教育用户在不需要扩展时适当地引用之外,您无法采取任何措施来阻止它:

$ your_prog "~/foo"
于 2012-09-03T01:29:59.987 回答
4

您可以使用read命令来接受用户输入。

read var
echo "$var"
于 2012-09-03T01:13:17.030 回答
3

查尔斯达菲有正确的答案。您的程序的行为完全符合预期。试试这些:

$ echo The HOME directory is ~
$ echo "The HOME directory is ~"

您会看到,仅将波浪号放在引号中就可以防止扩展。

尽管您引用了引号,但您看不到波浪号的原因是,shell 在您的程序甚至将波浪号作为参数获取之前扩展了波浪号。

Unix 中的 shell 本身就是一个非常强大的生物。它处理变量和特殊字符的扩展,例如~and *,因此您的程序不必这样做。

正如一位老教授曾经告诉我的那样,“这很好,除非它不是”。在这种特殊情况下,“不是”。Unix shell 阻止你看到你想要的东西。

解决这个问题的唯一方法是摆脱外壳。您可以通过使用该read语句来做到这一点。

于 2012-09-03T02:53:51.267 回答