将波浪号回送到文件而不在Bash中展开它

时间:2012-09-03 01:02:53

标签: bash escaping tilde

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

echo "Argument is: $1" >> file

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

3 个答案:

答案 0 :(得分:6)

我认为你的程序是以:

开始的
$ your_prog ~/foo

在你的程序开始之前翻译了这个参数,所以除了教育用户在不需要扩展时教导用户正确引用时,除了教育用户之外没有什么办法可以阻止它:

$ your_prog "~/foo"

答案 1 :(得分:4)

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

read var
echo "$var"

答案 2 :(得分:3)

Charles Duffy有正确的答案。你的程序表现完全符合预期。试试这些:

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

您会看到仅仅将波浪号放在引号中会阻止扩展。

尽管有引号,但是你没有看到波形符的原因是shell在程序甚至将其作为参数之前扩展了波形符。

Unix中的shell本身就是一个非常强大的生物。它处理~*等变量和特殊字符的扩展,因此您的程序不需要。

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

解决这个问题的唯一方法是摆脱shell。您可以使用read语句来完成此操作。