shell脚本,不一定要写if else。可以通过运算符||
与&&
管理命令, 我的理解是通过命令返回状态$?
来决定运行哪个/块命令。
我们最常见的例子是mkdir -p test && cd $_
。
更加复杂的例子是运算符||
和&&
配合{}
或()
写。不要觉得没必要,这可能是你工作以后shell脚本常态。
今天以利用Aspera
从ENA数据库下载测序数据为例进行简单举例。下面给个稍微简单点的一个示例命令。
背景
ascp -vQT -l 500m -P33001 -k 1 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR104/008/SRR1047168/SRR1047168_1.fastq.gz ./
参数-k 1
表示可接续下载。当下载完SRR21619728.fastq.gz
后,再次运行该命令时,会跳过该文件的运行,但是跳过该文件的之前会有一定的网络检测(观察后的结论)。Aspera
下载测序数据很依赖网络,有时下载一个文件可能会报错,在不同时间段运行时又可以下载。当我们把较多的下载命令均放入一个脚本时,尝试第二次运行脚本来下载第一次运行下载失败的文件时,每个成功下载的文件,都需要连接网络检测文件已下载。这样的联网对于较大的项目下载是很不利的,因此我们需要自己写个检测,来跳过已经下载好的文件,使得这个检测不再依赖网络。
运算符||与&&
该写法如下:
[[ -f ./SRR1047168_1.fastq.gz ]] && echo "Skip: SRR1047168_1.fastq.gz" || ascp -vQT -l 500m -P33001 -k 1 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR104/008/SRR1047168/SRR1047168_1.fastq.gz ./
这里并没有使用if else 写判断,而是通过运算符||
和&&
来控制命令的运行。
先检测测序文件是否存在,如果存在则打印“Skip: SRR21619728.fastq.gz
” 来提示我们跳过该文件下载,如果不存在,则尝试下载该文件。
给个项目例子
以PRJNA63661
为例,这是我的一个客户要求下载的项目数据。大家可以感受下不写检测和写检测时的下载完成该项目的用时。
$ run_get_bioinfo_sample_v0.3.sh PRJNA63661
$ cat ./ena_info_sample_PRJNA63661/run_downloaded_fastq_using_aspera.sh |wc -l
10871
可以看到,一共10871个文件需要下载。run_downloaded_fastq_using_aspera.sh
可在百度网盘自提。
链接:https://pan.baidu.com/s/1L1KxnDZkNaJ0q4slMCm1cg?pwd=yyds
提取码:yyds
–来自百度网盘超级会员V6的分享【链接7天有效期】