bash中变量的空格和花括号

时间:2014-11-20 13:20:19

标签: linux bash syntax quoting

有没有办法让${VAR}展开,好像是用双引号引用的?

这不是我想看到的:

% A="some spaces in there"
% touch ${A}
% ls -1
in
some
spaces
there

当然,我可以使用像"$VAR"这样的典型符号。但是在引用文本等中使用引号时这很麻烦。我想知道是否有一种扩展$ {...}符号的方法可以将${...}视为"${...}",而不是使用双引号本身?

2 个答案:

答案 0 :(得分:3)

不关注accepted best practice(并了解shell 真正的工作原理)很可能会咬你。反复。随着僵尸病毒感染的f牙。一些可以帮助的事情:

  • 只要起始和结束引号彼此相邻,您就可以对单个参数的不同部分使用不同的引号:

    $ printf '%q\n' "foo 'bar' baz"'nuu "boo" zoo'
    foo\ \'bar\'\ baznuu\ \"boo\"\ zoo
    
  • 您可以在子shell中设置IFS以避免搞砸整个脚本:

    $ a="some spaces in there"
    $ (IFS= && touch ${a})
    $ ls -1
    some spaces in there
    

答案 1 :(得分:1)

您可以设置IFS variable 在shell拆分变量时忽略空格。当获取可能在循环中包含空格的输入时,这也很有用。

$ cat /tmp/t.sh
IFS="$(printf '\n\t')"
A="some spaces in there"
touch ${A}
ls -l
$ /tmp/t.sh
some spaces in there

(如果在你的字符串中有像*这样的字符,请尝试使用set -f来禁用globbing(请参阅帮助集),感谢@glenn jackman。但实际上,在文件名中加上*会有问题!)

原作:

$ cat /tmp/t.sh
#!/bin/bash
A="some spaces in there"
touch ${A}
ls -1
$ /tmp/t.sh 
in
some
spaces
there
$