我的shell脚本中的逻辑OR

时间:2016-09-01 14:19:55

标签: bash shell

我的剧本:

#!/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的文件,但不复制文件。 为什么呢?

4 个答案:

答案 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是否包含THxTHy

for file in *.ats; do
    if [[ $file == *TH[xy]* ]]; then
       cp "$file" /home/milenko/procmt
    fi
done