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

Linux结构化语句

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

条件语句 if

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

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

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

  • if语句的第一种结构:条件成立做什么事情
 if [ condition ]
then
    commands
fi
## condition是条件
##then条件成立
##fi退出
  • if语句的第二种结构:条件不成立又要做什么事情
if [ condition ]
then
    commands
else
    commands
fi
##第二个command是第一个条件不成立之后写的命令
  • if语句的第三种结构:嵌套结构
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循环语句的常见格式
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循环语句的常见格式:
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*
##可以查看,对于内容简单的文本,可以这么看,要是内容多,没意义,会刷屏
自己试试批量查看纯文本文件
说明

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容