Linux生信小白入门Linux

Linux结构化语句-条件与循环

2022-04-09  本文已影响0人  Ashu

Linux结构化语句

  • 条件语句 if
  • 循环语句: for 循环和 while循环

条件语句 if

if 条件语句的常见格式如下,注意空格

生信技能树小郭老师的课件图-if条件语句

有头有尾,一个if 就要对应一个 fi 。有三种结构:

 if [ condition ]
then
    commands
fi
## condition是条件
##then条件成立
##fi退出
if [ condition ]
then
    commands
else
    commands
fi
##第二个command是第一个条件不成立之后写的命令
if [ condition ]
then
    commands
else
    if [ condition ]
    then
        commands
    fi
fi
#####(else if 可以缩写为 elif ),如下:
if [ condition ]
then
    commands
elif [ condition ]
    then
        commands
    fi
fi
##有多少个if就要有多个fi,第一个if与最后一个fi对应,第二个if与第一个fi对应

if 条件语句的常见条件:数值判断、字符串判断、文件判断

用法 解释
[ N1 -eq N2 ] N1 和 N2 两数相等返回为真
[ N1 -ne N2 ] N1 和 N2 两数不等返回为真
[ N1 -gt N2 ] N1 大于 N2 返回为真
[ N1 -ge N2 ] N1 大于等于 N2 返回为真
[ N1 -lt N2 ] N1 小于 N2 返回为真
[ N1 -le N2 ] N1 小于等于 N2 返回为真

注意细节:[ N1 -eq N2 ],[N1之间必须有空格N2]之间必须有空格;-eq有时候用=替代,但是规范的写法还是-eq;有时候网上教程把[ N1 -eq N2 ]写成[[ N1 -eq N2 ]]集两个中括号[[ ]],有时候还有人用小括号(),

示例:

# 数值判断
if [ 1 -eq 1 ]
then
  echo  "Welcome to Biotrainee() !"
else
  echo  "**************"
fi
if数值判断示例
if [ 1 -eq 1 ]
> then
> echo "Welcome to Biotrainee() !"
> else echo "**************"
> fi
##> 大于号是系统自动出现,表示命令没有完成
##用双引号,双引号里变量会被解释,单引号里变量不会被解释
if数值判断简单例子演示

可以用一整句代码完成,用分号隔开,if...; then...; else...; fi

if [ 1 -eq 2 ]; then echo "abc"; else echo "123"; fi
##用分号,一整句代码的好处是,可以修改。
if数值判断一句代码
# 结合状态参数 $?
if [ $? -eq 0 ]
then
  touch  ok.txt
fi
##$?表示的是上一句代码是否执行成功,为0表示执行成功
##有时候处理需要分成很多步,通过if语句判断上一句命令是否成功
##以后自己写流程写pipline时,自己去探索
结合状态参数 $?示例
用法 解释
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 STRING1字典排序在STRING2前面则返回为真 > 同理

做数据处理时不常用,可能运维工程师可能用到,做生信分析不常用到。

用法 解释
[ -a FILE ] 如果 FILE 存在则为真
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真

-a:判断文件FILE是否存在
-d:是否存在一个文件夹FIL
-f:判断一个普通文件,就是文本文件,上一个流程完成应该生成一个文件,用if判断,如果那样的文件,就可以往下一个流程走。

if [ $? -eq 0 ]; then touch ok1.txt; fi
ls
##以上步骤生成一个ok.txt

# 文件判断
if [ ! -f ok.txt ]
then
  touch  ok.txt
fi

if判断存在以及创建文件命令

循环语句

for循环语句
for i in list
do
   commands
done

##list是循环的条件,一个样本提交一个命令

初学者if语句用得比较少,循环语句用得比较多。

for i in  1 2 3 4 5 
do
  echo ${i} "Welcome to Biotrainee() !"
done

for i in {1..10}
do
  touch  file${i}
done
ls
###等差创建10个文件

list="CDS exon gene start_codon stop_codon transcript UTR"
for i in ${list}
do
  echo  "This feature is ${i}"
done
##用双引号,双引号里变量会被解释,单引号里变量不会被解释
##循环的结尾为done
##循环语句很长时,赋值给list变量。
循环语句的演示

自己很好奇,因为if语句能写成一整句代码,试了看看能不能用循环也写成一整句代码,结果是不行,list和分隔符不能被识别,循环不能写成一整句代码,得一步步来

循环语句不能写成一整句代码

用优先级命令来作为循环条件,优先级符号``

ls
ls file*
for i in `ls file*`
> do
> mv ${i} ${i}.txt
> done
ls *txt
#file1.txt   file2.txt  file4.txt  file6.txt  file8.txt  ok.txt
#file10.txt  file3.txt  file5.txt  file7.txt  file9.txt  readme.txt
###ls file*把这个结果作为条件,
###用反引号``把ls file*括起来,里面的代码有最高优先级,`ls file*`会被优先执行,把10个结果当成条件,放到i in的后面,i在这10个条件里循环
##对10个文件可以进行一些操作,如删除,这里演示的是重命名mv ${i} ${i}.txt,把fiel1..file10重命名为fiel1.txt..file10.txt
优先级循环方法
while 循环
while read id 
do
     commands
done
##id相当于i,自定义的一个变量,可以随便命名,

原来的格式:(比较老,不常用)

while command 
do
    other commands
done

示例

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%.txt}的后缀名去掉
##单独运行cat config显示一个文件就是单独一行,共10行,ls file*出的结果占一行,主要是ls根据窗口大小去调。如果把窗口设置小也是10行。

ls  file* > config
cat config | while  read id
do 
  mv  ${id}  ${id/txt/csv}
done
ls
##${id/txt/csv}把txt变为csv
##while循环是怎么传递的:
#cat config | while  read id,其中cat config 产生10行,一行就是一个id

ls  file* > config
cat config | while  read id
do 
  mv  ${id}  ${id.*}
done
ls
while循环的一个例子
while循环批量去掉文件后缀
while循环去掉后缀

while批量给文件加后缀和替换后缀

while加后缀和替换后缀

while循环结合*去掉文件后缀

while循环结合*去掉后缀

结构化语句练习:

1.运行下面两句命令

id=example
fastqc ~/Data/${id}.fq
练习题1

2.用 if 判断 $? 的是否为0,如果是,输出yes,如果否,输出no

if [ $? -eq 0 ]
> then
> echo "yes"
> else
> echo "no"
> fi
#yes
##if语句里的[]记得与其它字符之间要有空格
结构语句练习题2

1到2题的答案:

id=example
fastqc ~/Data/${id}.fq
if [ $? -eq 0 ]
then
  echo "yes"
else 
  echo "no"
fi

3.生成10个文件,file1~10

 touch file{1..10}
批量创建10个文件
4.用 while read id 循环,在每个文件中写入一句话 (提示:echo xxx > ${id} )
#touch file{1..10}
##在第三题上创建的10个文件进行操作
ls
 ls file* >config
 cat config
  cat config | while read id
> do
> echo "hello welcome to Biotrainee()!" >${id}
> done
cat config
cat file1
##hello welcome to Biotrainee()!
######以上是自己一步步探索,作为除学者,多敲些代码
  ls file* | while read id
> do
> echo "hello welcome to Biotrainee()!" >${id}
> done
cat file1
##>表示重定向,也可以用>>追加,添加内容
结构化练习题4

3到4题的答案:

touch  file{1..10}

ls file* | while read id
do 
  echo  "xxx"  > ${id}
done
cat fiel{1..10}
##报错,不能这么用
cat file*
##可以查看,对于内容简单的文本,可以这么看,要是内容多,没意义,会刷屏
自己试试批量查看纯文本文件
说明

以上内容是听生信技能树小郭老师授课内容以及参考课件。

上一篇下一篇

猜你喜欢

热点阅读