我在bash脚本中有一个字符串
foo="~/mydir" (not foo=~/mydir)
然后我需要使用
创建这个目录mkdir ${foo}
是否可以将foo解释为
<"user's home directory">/mydir
但不是
<"current work directory">/~/mydir.
答案 0 :(得分:0)
如上所述,您可以使用$HOME
来指示用户的主目录。
但要注意:
富= “〜/ MYDIR”
不会扩展波浪号,因此“echo $ foo”仍会导致“〜/ mydir”。如果要扩展波形符,可以使用
eval foo=$foo
现在“echo $ foo”会在“/ home / fred / mydir”中产生结果 代字号扩展有点特殊,它不是$ HOME的简单替代品;看看以下内容:
foo="~/mydir"
echo ${foo/#\~/$HOME} (reply: /home/administrator/mydir)
eval foo=$foo
echo $foo (reply: /home/administrator/mydir)
---
foo="~administrator/mydir"
echo ${foo/#\~/$HOME} (reply: /home/administratoradministrator/mydir)
eval foo=$foo
echo $foo (reply: /home/administrator/mydir)
换句话说:如果你总是使用简单的形式“〜/ ...”,用$ HOME代替代字号就可以了。如果你有更高级的格式,那么eval会更好,你可以在上面的第二个例子中看到。
简单的“eval foo = $ foo”在文件名中存在空格问题:
foo="~administrator/mydir with spaces"
eval foo=$foo (error: with: command not found)
以下语法更好:
foo2=$(eval echo $foo)
echo $foo2 (ok: /home/administrator/mydir with space)
希望它有所帮助。
答案 1 :(得分:0)
您可以延迟使用代字号,直到您需要创建目录:
foo="mydir"
....
mkdir ~/"$foo"
只有在不加引号的情况下,代字号才会扩展到主目录。
Bash手册的相关部分: https://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion