【问题标题】:Bash script: how to stop looping after a match was found?Bash脚本:找到匹配项后如何停止循环?
【发布时间】:2021-06-11 21:31:20
【问题描述】:

这一定很基础,但我找不到解决方法。

我有一个这样的脚本:

#!/bin/bash

seqFolder="/raw_data/data"

seqmode="paired"

Input=$(basename ${seqFolder});

if [ $seqmode = paired ]; then

    for x in $seqFolder/*; do
        if [[ "$x" =~ .*\.fastq.gz$ ]]; then
            z=$(basename $x 1_001.fastq.gz)

            echo $z
            echo "file of this iteration $z"1_001.fastq.gz" $z"2_001.fastq.gz""
        fi
    done
fi

当我运行这个脚本时,我得到了这个:

MG-AB-17_S17_R
file of this iteration MG-AB-17_S17_R1_001.fastq.gz MG-AB-17_S17_R2_001.fastq.gz
MG-AB-17_S17_R2_001.fastq.gz
file of this iteration MG-AB-17_S17_R2_001.fastq.gz1_001.fastq.gz MG-    AB-17_S17_R2_001.fastq.gz2_001.fastq.gz
MG-AB-81_S74_R
file of this iteration MG-AB-81_S74_R1_001.fastq.gz MG-AB-81_S74_R2_001.fastq.gz
MG-AB-81_S74_R2_001.fastq.gz
file of this iteration MG-AB-81_S74_R2_001.fastq.gz1_001.fastq.gz MG-  AB-81_S74_R2_001.fastq.gz2_001.fastq.gz

/raw_data/data 中的文件是这 4 个(这只是示例):

MG-AB-17_S17_R1_001.fastq.gz
MG-AB-17_S17_R2_001.fastq.gz
MG-AB-81_S74_R1_001.fastq.gz
MG-AB-81_S74_R2_001.fastq.gz

问题是我不希望我的变量 $z 成为 MG-AB-17_S17_R2_001.fastq.gzMG-AB-81_S74_R2_001.fastq.gz,因为文件如下:

MG-AB-17_S17_R2_001.fastq.gz1_001.fastq.gz
MG-AB-17_S17_R2_001.fastq.gz2_001.fastq.gz 
... 

目录/raw_data/data中不存在

我认为"$x" =~ .*\.fastq.gz$ 中的.fastq.gz$ 可以确保这一点,但似乎并非如此。能否请教。

【问题讨论】:

  • 所有文件名都与正则表达式 .*\.fastq.gz$ 匹配。该检查应该如何排除这些文件?
  • 我只想匹配/解析/处理这4个文件:MG-AB-17_S17_R1_001.fastq.gz MG-AB-17_S17_R2_001.fastq.gz MG-AB-81_S74_R1_001.fastq.gz MG- AB-81_S74_R2_001.fastq.gz。问题是我的脚本(有漏洞)发明了新文件,例如:MG-AB-17_S17_R2_001.fastq.gz1_001.fastq.gz
  • 问题是您要删除后缀1_001.fastq.gz。但是有R2的文件没有那个后缀,所以basename不会去掉后缀。
  • 标题与帖子正文的关系如何?
  • 在循环中,您可以添加if 语句。当检查为真时,调用break 退出循环。

标签: regex bash loops


【解决方案1】:

您正在寻找break 声明。

$ cat /tmp/so3651.sh
#!/usr/bin/env bash

for i in 1 2 3 4 5; do
    echo "i: $i"
    if [[ -f /tmp/foo$i ]]; then
        echo "found it!"
        break
    fi
done

如果文件不存在,则生成:

$ /tmp/so3651.sh
i: 1
i: 2
i: 3
i: 4
i: 5

但是当文件确实存在时,它会提前停止:

$ touch /tmp/foo4
$ /tmp/so3651.sh
i: 1
i: 2
i: 3
i: 4
found it!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 2016-02-25
    • 2021-12-28
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多