花括号中的变量不起作用

时间:2014-09-29 09:50:05

标签: bash shell curly-braces

我有一个包含国家/地区文件夹的目录,其中可能存在名称加倍的文件夹:

 en_en es_es fr_fr de_de

我写了一个脚本来删除重复:

 for code in en de es fr it nl pt tr; do
   if [[ -d $code_$code ]]; then
     mv "${code}_${code}" "${code}"
   fi
 end

但它不起作用 - if下的代码永远不会被执行(我尝试在其中放置echo)。但是,以下工作:

 if [[ -d es_es ]]; then
   echo "foo"
 end

我正在使用(log)bash 3.2。

2 个答案:

答案 0 :(得分:9)

由于$code_$code正在寻找code_ + code,因此您需要检查code + _ + code。为此,请使用大括号:${code}_${code}

for code in en de es fr it nl pt tr; do
   if [[ -d "${code}_${code}" ]]; then # <---- here (note also it is good to quote)
     mv "${code}_${code}" "${code}"
   fi
end

这是因为_可以出现在变量的名称中,因此我们使用大括号来确定调用它们时的名称。

见另一个例子:

$ this=3
$ that=4
$ echo $this_$that
4
$ echo ${this}_${that}
3_4
$ this_=5
$ echo $this_$that
54

答案 1 :(得分:2)

问题是$ code_ $ code。下划线是标识符的有效字符,因此bash正在查找变量$code_

可以使用\_"${code}_${code}"来修复,后者是首选。

示例:

[root@TIAGO-TEST2 tmp]# for code in en de es fr it nl pt tr; do echo $code_$code; done
en
de
es
fr
it
nl
pt
tr

使用\_

[root@TIAGO-TEST2 tmp]# for code in en de es fr it nl pt tr; do echo $code\_$code; done
en_en
de_de
es_es
fr_fr
it_it
nl_nl
pt_pt
tr_tr

使用${code}_{code}

[root@TIAGO-TEST2 tmp]# for code in en de es fr it nl pt tr; do echo ${code}_${code}; done
en_en
de_de
es_es
fr_fr
it_it
nl_nl
pt_pt
tr_tr