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

7

我需要在Bash脚本中向文件写入一个参数,所以我正在做类似于这样的操作:

echo "Argument is: $1" >> file

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


1
用户需要传递带引号("")的参数或需要转义\~ - Prince John Wesley
@PrinceJohnWesley 我不想把那作为用户需求。 - gsgx
我不确定你能否解决这个问题(外壳始终会扩展,除非用户引用参数)。我认为提示用户输入是你唯一的希望。最近我也遇到了这个问题,所以你并不孤单,被这个“特性”咬了一口。 - Jonah Bishop
3
如果用户键入 your-script ~/foo,则 ~ 将由用户的shell进行扩展。 对于 your-script 来说,没有办法知道用户键入了波浪号; 它所看到的仅是参数 "/home/theuser/foo"。 任何bash用户都需要注意这种行为。 由于 ~ 表示 用户的主目录,那么为什么不想要将其扩展? - Keith Thompson
3个回答

6

我假设您的程序是这样启动的:

$ your_prog ~/foo

在您的程序启动之前,参数已经被翻译了,因此除了教育用户适当引用以避免不必要的扩展之外,您无法阻止它:

$ your_prog "~/foo"

4
您可以使用read命令接受用户输入。
read var
echo "$var"

3

Charles Duffy提供了正确的答案。你的程序表现正常。尝试以下操作:

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

您会发现,仅将波浪号放在引号中即可防止其展开。
即使您加上了引号,也不会看到波浪号的原因是,shell在您的程序甚至将它作为参数之前就扩展了波浪号。
Unix中的shell本身就是一个非常强大的实体。它处理变量和特殊字符(如~和*)的扩展,因此您的程序不必这么做。
正如一位老教授曾经告诉我的那样,“这很好,除非它不是”。在这种特定情况下,“它不是”。Unix shell正在阻止您看到想要的内容。
唯一的解决方法是摆脱shell。您可以通过使用“read”语句来做到这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接