zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux - 结构化语句及参数扩展

2023-03-07 09:51:17 时间

生信技能树学习笔记

if 条件语句

常见格式

image.png

常见条件:数值判断、字符串判断、文件判断

数值判断

  • eq 等于
  • ne 不等于
  • gt 大于
  • ge 大于等于
  • lt 小于
  • le 小于等于
if [ 1 -eq 1 ]  ## 括号和数字之间要有空格
> then
> echo "Welcome"
> else
> echo "***"
> fi
if [ $? -eq 0 ]   ## 判断上一个命令是否执行成功
> then
> touch ok.txt
> fi

字符串判断

  • -z STRING STRING的长度为零则返回为真
  • -n STRING STRING的长度非零则返回为真
  • STRING1 字符串不为空则返回为真
  • STRING1 == STRING2 字符串相同则返回为真
  • STRING1 != STRING2 字符串不相同则返回为真
  • STRING1 < STRING2 如果STRING1字典排序在STRING2前则为真
if [ -z $1]
> then
> echo "usage: $0 <fq file> > <fa file>"
> exit $E_BADARGS
> fi

文件判断

  • -a FILE ## 如果FILE存在即为真
  • -d FILE ## 如果FILE存在且是一个目录则返回为真
  • -f FILE ## 如果FILE存在且是一个普通文件则返回为真
if [ ! -f ok.txt ] 
> then
> touch ok.txt
>fi

for 循环语句

image.png
for i in 1 2 3 4 5
> do
> echo "$i Hi!"
> sleep 3s
> done
for i in {1..10}
> do
> touch file${i} ## 变量建议加花括号
> done
list="CDS exon gene start_codon stop codon transcript UTR"
for i in ${list}
> do
> echo "This feature in ${i}"
> done
ls file*
for i in `ls file*`   ## 反引号最优先执行
> do
> mv ${i} ${i}.txt
> done

while 循环

image.png
ls file* | while read id
> do
> mv ${id} ${id}.txt
> done
ls file* > config
cat config | while read id
> do
> mv ${id} ${id%.txt} ## 减少一段后缀
> done

参数扩展

作用:掐头去尾

  • ${变量#关键字} ——若变量内容从开始的数据符合“关键字”,则将符合的最数据删除
  • ${变量##关键字}——若变量内容从开始的数据符合“关键字”,则将符合的最数据删除
  • ${变量%关键字}——若变量内容从开始的数据符合“关键字”,则将符合的最数据删除
  • ${变量%%关键字}——若变量内容从开始的数据符合“关键字”,则将符合的最数据删除
id=example.test.fq ## 定义变量
echo ${id#*.}  ## 此时输出 test.fq (从头删直到最短的 . 为止)
echo ${id#*e} ## 此时输出 xample.test.fq (从头删直到最短的e为止)
echo ${id##*e} ## 此时输出 st.fq (从头删直到最长的e为止)
echo ${id%.*} ## 此时输出 example.txt (从后往前删直到最短的.为止)
echo ${id%%e*} ## 此时输出  (从后往前删直到最长的e为止)
echo ${id%.*}.fa ## 此时输出 example.test.fa (把example.fq变成example.fa) 
  • ${变量/旧字符串/新字符串} 若变量内容符合“旧字符串”,则首个旧字符串会被新字符串替换
  • ${变量//旧字符串/新字符串} 若变量内容符合“旧字符串”,则全部旧字符串会被新字符串替换
id=Data.tar.gz
echo ${id/ta/xy} ## 输出Daxy.tar.gz
echo ${id//ta/xy} ## 输出Daxy.xyr.gz
  • ${变量:索引} 截取变量从索引为止到末尾的所有字符
  • ${变量:索引:n} 截取变量从索引位置开始的n个字符
  • ${变量:索引:(-n)} 截取变量从索引位置到倒数第n+1为的所有字符
  • ${变量:索引:-n}
id=Data.tar.gz
echo $id ## 输出Data.tar.gz
echo ${#id} ## 输出11 (变量前加 # 输出长度,从0开始一直到10)
echo ${id:3} ## 输出a.tar.gz
echo ${id:3:5} ## 输出a.tar
echo ${id:3:-1} ## 输出a.tar.g

练习

## 用for循环生成SRR1234501.fastq到SRR1234510.fastq的10个空文件
for i in {1..10}
> do 
> touch SRR12345${i}.fastq
> done

## 生成fq2fa.sh处理这些文件的命令
ls *fastq | while read id
> do
> echo "fq2fa.sh ${id} > {id%.*}.fasta"
> done

## 或者
ls *fastq | while read id
> do
> echo "fq2fa.sh ${id} > ${id/fastq/fasta}
> done
id=example
fastqc ~/Data/${id}.fq

## 用if判断$?的是否为0,如果是,输出yes,如果否,输出no
if [ $? -eq 0 ]
> then
> echo "yes"
> else
> echo "no"
> fi

## 生成10个文件,file1-10
for i in {1..10}
> do
> touch file${i}
> done

## 用 while read id 循环,在每个文件中写入一句话
ls file* | while read id
> do
> echo "Hi!" > ${id}
> done