2016-08-10 60 views
1

我的脚本猛砸字面匹配

#!/bin/bash 

shopt -s extglob 
for i in *.dat; 
do 
    if [[ "$i" == *(_TEx) ]];then 
     file1=$i 
    fi 
done 

echo file1="$file1" 

我与 http://www.shellcheck.net/

$ shellcheck myscript 
No issues detected! 

文件

262_V01_C00_R000_TEx_BL_2048H.dat 
262_V01_C01_R000_TEy_BL_2048H.dat 
262_V01_C02_R000_THx_BL_2048H.dat 
262_V01_C03_R000_THy_BL_2048H.dat 

[email protected]:~/procmt$ bash a8.sh 
file1= 
测试脚本

为什么?

+0

这意味着没有与此模式匹配的文件 – fedorqui

+0

@JohnKugelman看看我的编辑,有4个文件,一个匹配这两个条件。 –

回答

4

最小修改您的尝试,使其工作会是这样:

if [[ "$i" == *_TEx* ]]; then 

即去掉括号,并在模式的结尾添加缺少*。不需要设置extglob shell选项,因为您不需要使用它的任何功能。

不过,你不妨改变你的循环在这个水珠:

for i in *_TEx*.dat; 

,避免if完全。

更重要的是,你可以只直接打印匹配:

shopt -s nullglob 
printf '%s\n' *_TEx*.dat # print all files matching the pattern 

nullglob在这里有用,因为它会导致没有输出时没有文件匹配的模式。

3

*(_TEx)匹配一个文件名,该文件名仅包含字符串_TEx反复重复,如_TEx_TEx_TEx_TEx。您需要的是*_TEx*,不需要扩展glob。然后你可以把它和*.dat glob结合起来,完全摆脱循环。

echo *_TEx*.dat 
2

Tom Fenech's helpful answerJohn Kugelman's helpful answer您展示基于简单水珠有效的解决方案。

如果你想使用扩展通配,因为你已经尝试(这是必要与样品输入):

[[ "$i" == *@(_TEx)* ]] 

,或者这个水珠进入循环水珠折:

for i in *@(_TEx)*.dat; do # ... 

假设shopt -s extglob,但请注意这里面[[ ... ]],延长通配是隐含在Bash v4.1 +中为==!=的RHS打开。


  • 整个文件名既简单又扩展水珠匹配,所以*(_TEx)本身是不够的 - 你必须提供封闭*字符。以便匹配图案前后的字符。

  • 扩展-水珠构造*(_TEx)匹配零或更多出现_TEx,这有效地相匹配:(a)所述空字符串,或(b)任何数目的_TEx重复;结合封入的*字符,这有效地匹配全部文件名;
    相比之下,@(_TEx)匹配的_TEx正好一个发生(但,这表现在所引用的答案,简单地包括在一个简单的水珠_TEx不相同。)。