我想存储一个我经常使用的路径作为环境变量,然后调用这个变量来构造路径名。
$ mypath="~/local/bin/"
$ newFile="${mypath}newFile.sh"
$ echo $newFile
~/local/bin/newFile.sh
这似乎有效。
但是,如果我调用 $newFile 作为 touch 的输入,则会失败:
$ touch $newFile
touch: ~/local/bin/newFile.sh: No such file or directory
$ touch "${mypath}newFile.sh"
touch: ~/local/bin/newFile.sh: No such file or directory
两者都不起作用。我缺少什么?
PS 我确信这已经被讨论过,但我是 bash 新手,所以我还不知道要搜索的行话是什么。谢谢你的帮助。
答案1
由于扩展顺序的原因,这不会按照您期望的方式工作。
来自 bash 手册:
展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。
在第一行中,~
如果不带引号使用,则会扩展。事实上,~
引号内部不会扩展,并且后面也不会扩展,因为波形符扩展是在变量扩展之前完成的。
您写道它似乎有效,但事实上echo
is的输出~/local/bin/newFile.sh
表明它不起作用。
如果由于值包含空格而需要引用,则可以引用后面的部分~/
:
mypath=~/"local/bin with spaces/"
newFile="${mypath}newFile.sh"
echo "$newFile"
答案2
显然,我立刻就找到了答案。
$ newFile="${mypath}newFile.sh"
touch newFile
不起作用
$ newFile=${mypath}newFile.sh
touch newFile
确实有效