我的剧本:
#!/bin/bash
for file in *.ats;
do
if [[ ("${file}" = THx) || ("${file}" = THy)]]
then cp $file /home/milenko/procmt
fi
done
目录中的文件
262_V01_C00_R000_TEx_BL_128H.ats
262_V01_C01_R000_TEy_BL_128H.ats
262_V01_C02_R000_THx_BL_128H.ats
262_V01_C03_R000_THy_BL_128H.ats
我想要的是复制包含THx或THy的文件,但不复制文件。 为什么呢?
答案 0 :(得分:9)
我认为你可以完全避免循环:
cp *TH[xy]*.ats /home/milenko/procmt
没有必要循环结果,然后进行单独的比较;单个glob将扩展到您想要的文件列表。
您的原始方法存在一些问题:
]]
是复合命令[[
中的关键字,因此它需要是一个单独的单词(即用空格包围)。答案 1 :(得分:6)
如何使用Aurelia CLI进行扩展通配?这样您就可以使用for
本身来获取所需的扩展名:
shopt -s extglob
for file in *TH?(x|y)*.ats; do
# do things with "$file" ...
done
*TH?(x|y)*.ats
扩展为包含<something> + TH + either x or y + <something> + .ats
您的脚本失败,因为其中有拼写错误:
if [[ ("${file}" = THx) || ("${file}" = THy)]]
# ^
# missing space
这很好:
$ d="hi"
$ [[ ($d == hi) || ($d == ha) ]] && echo "yes"
yes
虽然括号是多余的:
$ [[ $d == hi || $d == ha ]] && echo "yes"
yes
答案 2 :(得分:5)
您的问题指定&#34;包含THx或THy&#34;的文件...但您的代码指定文件名 THx或THy。
答案 3 :(得分:4)
你可以在glob中使用字符类,*TH[xy]*
来检查$file
是否包含THx
或THy
:
for file in *.ats; do
if [[ $file == *TH[xy]* ]]; then
cp "$file" /home/milenko/procmt
fi
done