bash:〜在shell脚本里面扩展

时间:2014-03-24 19:24:28

标签: bash shell

我尝试编写一个简单的shell脚本来构建用于分析的管道,一步涉及构建现有目录和文件的符号链接。

最初我设置如下:

dir='~/project/xxxx/'
ln -s $dir .

但是,上述代码并不起作用。

我发现,在执行shell脚本时,它没有被扩展。

我尝试在目录路径周围使用双引号而不是单引号,但这也没有用。

以下工作

dir="$HOME/project/xxxx/"
ln -s $dir .

我只是想知道为什么〜没有用。这个现象的正式名称是什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

在任何类型的引号内都不会出现Tilde扩展。因此,例如,改为使用:

dir=~'/project/xxxx/'

另请注意,如果您使用~username/格式,则username/部分也必须不加引号。来自man bash

  

Tilde扩张

   If a word begins with an unquoted tilde character (`~'),  all  of
   the characters preceding the first unquoted slash (or all charac‐
   ters, if there is no unquoted slash) are considered a  tilde-pre‐
   fix.   If  none of the characters in the tilde-prefix are quoted,
   the characters  in  the  tilde-prefix  following  the  tilde  are
   treated as a possible login name.  If this login name is the null
   string, the tilde is replaced with the value of the shell parame‐
   ter  HOME.  If HOME is unset, the home directory of the user exe‐
   cuting the shell is substituted instead.  Otherwise,  the  tilde-
   prefix  is  replaced  with the home directory associated with the
   specified login name.

答案 1 :(得分:2)

I figured it out that the ~ didn't get expanded inside the shell script when it's executed.

不正确,它不会在单引号中扩展

The following worked `dir='$HOME/project/xxxx/'`

这是谎言,也不会扩大。

使用不带引号的~,或使用双引号中没有引号/的$HOME

请记住,您可以使用各种引用连接字符串:

echo a"b"'c'
abc

如果这有助于提高可读性,请从路径中移出~

我的建议:更喜欢$HOME

答案 2 :(得分:1)

只需从引号中取出代号:dir=~/'project/xxxx/'