我有一个包含国家/地区文件夹的目录,其中可能存在名称加倍的文件夹:
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。
答案 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