如何用脚本来写脚本——Linux批量循环
2020-02-25 本文已影响0人
Steven潘
以前在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
-
这样所需的命令就会打印在相应的脚本中,可以打开脚本进行检查和调试。确认无误后,再运行脚本文件,就可以批量运行计算啦。
-
把上面的命令行也保存在一个脚本中,这样就可以用脚本来写脚本了。