我需要在 Bash 脚本中向文件写入参数,所以我正在做这样的事情,
echo "Argument is: $1" >> file
问题是,如果参数中有波浪号 (~),我不希望它扩展到主目录。因此,如果用户将 ~/bin 作为参数传递给脚本,它将被写为 ~/bin 而不是 /home/user/bin。我该怎么做呢?
我假设您的程序启动为:
$ your_prog ~/foo
该参数甚至在您的程序启动之前就被翻译了,因此除了教育用户在不需要扩展时适当地引用之外,您无法采取任何措施来阻止它:
$ your_prog "~/foo"
您可以使用read
命令来接受用户输入。
read var
echo "$var"
查尔斯达菲有正确的答案。您的程序的行为完全符合预期。试试这些:
$ echo The HOME directory is ~
$ echo "The HOME directory is ~"
您会看到,仅将波浪号放在引号中就可以防止扩展。
尽管您引用了引号,但您看不到波浪号的原因是,shell 在您的程序甚至将波浪号作为参数获取之前扩展了波浪号。
Unix 中的 shell 本身就是一个非常强大的生物。它处理变量和特殊字符的扩展,例如~
and *
,因此您的程序不必这样做。
正如一位老教授曾经告诉我的那样,“这很好,除非它不是”。在这种特殊情况下,“不是”。Unix shell 阻止你看到你想要的东西。
解决这个问题的唯一方法是摆脱外壳。您可以通过使用该read
语句来做到这一点。