2014-09-29 38 views
1

我有一个国家的文件夹目录,其中有可能是已经翻了一倍名称的文件夹:变大括号内不工作

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 

我正在使用(日志)bash 3.2。

回答

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 
+0

酷,的作品!但是,为什么有什么不同? (我会尽快接受。) – 2014-09-29 09:53:32

+1

@ janko-m因为'_'是变量名称的一部分; '$ code_ $ code'与'$ {code _} $ {code}'相同。 – Biffen 2014-09-29 10:05:14

+0

@ janko -m yes!查看我刚刚添加到我的答案中的一个示例中的差异 – fedorqui 2014-09-29 10:15:49

2

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

它可以通过使用\_"${code}_${code}"来固定,后者是首选。

例子:

[[email protected] 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 

使用\_

[[email protected] 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}

[[email protected] 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