我已经写了这个脚本:
#!/bin/bash
file="~/Desktop/test.txt"
echo "TESTING" > $file
./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory
我做错了什么?
尝试用$HOME
替换~
。只有在波浪号未被引用时才会进行波浪号扩展。请参见info "(bash) Tilde Expansion"
。
你也可以使用file=~/Desktop
而不加引号,但如果你替换其中一部分为某个字段分隔符,则会出现错误。引用变量的值可能是一个养成好习惯的好事情。引用变量file=~/"Desktop"
也可以工作,但我认为这样做相当丑陋。
另一个倾向于在可能的情况下选择$HOME
的原因:波浪号扩展仅发生在单词开头。因此,如果command
本身进行波浪号扩展(这将因命令而异),则command --option=~/foo
仅在该命令中起作用,而command --option="$HOME/foo"
始终有效。
$file
转换为 ~/Desktop/test.txt
时,你已经错过了波浪线扩展阶段。请参见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions以了解扩展的顺序。 - Stephen Peval
:eval "echo "TESTING" > $file"
< p > eval
命令将命令作为参数,导致 shell 执行 Tilde expansion。 < /p >