[英]Variable in curly braces not working
我有一个包含国家/地区文件夹的目录,其中可能存在名称翻倍的文件夹:
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
永不执行, if
下面的代码(我也尝试在其中放置echo
)。 但是,以下工作原理:
if [[ -d es_es ]]; then
echo "foo"
end
我正在使用(log)bash 3.2。
因为$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
问题是$ 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.