繁体   English   中英

花括号中的变量不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM