bash字符串被解释为变量

时间:2017-02-28 10:10:35

标签: bash shell

我在bash脚本中有一个字符串

foo="~/mydir" (not foo=~/mydir)

然后我需要使用

创建这个目录
mkdir ${foo}

是否可以将foo解释为

<"user's home directory">/mydir

但不是

<"current work directory">/~/mydir.

2 个答案:

答案 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