如何用脚本来写脚本——Linux批量循环

以前在Linux写循环时都用 ls * | while read id ; do command line $id ; done 的结构,这种方式写起来很简单,但是调试起来有时容易出错,不容易检查。

最近学了一种新的批量循环方式:先用一个比较简单的脚本来写好另一个复杂的脚本,然后再运行后者来执行循环。

1 基础版本

for i in *.bam
do
    echo "command line $i > ${i}_output.txt" >>command.sh
done
#less command.sh
bash command.sh
  • 变量i会遍历*.fq文件,同时将所需的命令行循环打印在command.sh中。
  • 运行command.sh来执行批量循环,结果输出到${i}_output.txt文件中。
  • 双引号中$仍然生效,单引号中$被关闭,用\也可以对$进行转义。

2 双重循环版

for i in *.bam
do
    for j in *.bed
    do
        echo "command line -a $j -b $a > ${i}_${j}_output.txt" >> command.sh
    done
done
#less command.sh
bash command.sh
  • 结构清晰,非常好理解,尤其对C语言思维的人来说很友好。

3 echo一个带echo命令

for i in {1..3}
do
    echo "echo $i >> output.txt" >> command.sh
done
  • 运行以上代码,会在command.sh中打印以下内容:

echo 1 >> output.txt
echo 2 >> output.txt
echo 3 >> output.txt

  • 运行command.sh,会在output.txt中打印以下内容:

1
2
3

4 综合版

#变量i对bam文件遍历(外层循环)
for i in /data/aligned/*.sorted.bam
do
    x=${i%%.*} #删除最左侧.号以右的所有字符,即留下/data/aligned/*
    y=${x##*/} #删除最右侧/号以左的所有字符,即留下最简文件名*
    
    echo "echo ====Calculating $y====" > ${y}_command.sh
    #外层的echo会打印出echo ====Calculating $y====
    #其中$y会调用y的值。如果不希望调用,只希望打出“$y”这两个字符,那么就用把双引号改成单引号
    #${y}调用出y的值,并与其后的字符“_command.sh”进行拼接
    #每个i所使用的命令单独保持为一个脚本
    
    #变量j对bed文件遍历(内层循环)
    for j in /data/feature/*.bed 
    do
        echo "bedtools coverage -a $j -b $i >> ${y}_${j}_result.txt" >> ${y}_command.sh
        #这一句是最核心的命令
    done
    echo "echo ====$y finished.====" >> ${y}_command.sh
    #每一个i做完之后都报告一下
done
  • 这样所需的命令就会打印在相应的脚本中,可以打开脚本进行检查和调试。确认无误后,再运行脚本文件,就可以批量运行计算啦。

  • 把上面的命令行也保存在一个脚本中,这样就可以用脚本来写脚本了。

你可能感兴趣的:(如何用脚本来写脚本——Linux批量循环)