Linux结构化语句-条件与循环
2022-04-09 本文已影响0人
Ashu
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循环结合*
去掉文件后缀
结构化语句练习:
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*
##可以查看,对于内容简单的文本,可以这么看,要是内容多,没意义,会刷屏
自己试试批量查看纯文本文件
说明
以上内容是听生信技能树小郭老师授课内容以及参考课件。