Linux結(jié)構(gòu)化語句
- 條件語句 if
- 循環(huán)語句: for 循環(huán)和 while循環(huán)
條件語句 if
if 條件語句的常見格式如下,注意空格
有頭有尾,一個(gè)if
就要對應(yīng)一個(gè) fi
。有三種結(jié)構(gòu):
- if語句的第一種結(jié)構(gòu):條件成立做什么事情
if [ condition ]
then
commands
fi
## condition是條件
##then條件成立
##fi退出
- if語句的第二種結(jié)構(gòu):條件不成立又要做什么事情
if [ condition ]
then
commands
else
commands
fi
##第二個(gè)command是第一個(gè)條件不成立之后寫的命令
- if語句的第三種結(jié)構(gòu):嵌套結(jié)構(gòu)
if [ condition ]
then
commands
else
if [ condition ]
then
commands
fi
fi
#####(else if 可以縮寫為 elif ),如下:
if [ condition ]
then
commands
elif [ condition ]
then
commands
fi
fi
##有多少個(gè)if就要有多個(gè)fi,第一個(gè)if與最后一個(gè)fi對應(yīng)及皂,第二個(gè)if與第一個(gè)fi對應(yīng)
if 條件語句的常見條件:數(shù)值判斷甫男、字符串判斷、文件判斷
- 數(shù)值判斷:
用法 | 解釋 |
---|---|
[ N1 -eq N2 ] | N1 和 N2 兩數(shù)相等返回為真 |
[ N1 -ne N2 ] | N1 和 N2 兩數(shù)不等返回為真 |
[ N1 -gt N2 ] | N1 大于 N2 返回為真 |
[ N1 -ge N2 ] | N1 大于等于 N2 返回為真 |
[ N1 -lt N2 ] | N1 小于 N2 返回為真 |
[ N1 -le N2 ] | N1 小于等于 N2 返回為真 |
注意細(xì)節(jié):[ N1 -eq N2 ]验烧,[
與N1
之間必須有空格板驳、N2
與]
之間必須有空格;-eq
有時(shí)候用=
替代碍拆,但是規(guī)范的寫法還是-eq
若治;有時(shí)候網(wǎng)上教程把[ N1 -eq N2 ]寫成[[ N1 -eq N2 ]]集兩個(gè)中括號(hào)[[ ]]
,有時(shí)候還有人用小括號(hào)(),
示例:
# 數(shù)值判斷
if [ 1 -eq 1 ]
then
echo "Welcome to Biotrainee() !"
else
echo "**************"
fi
if [ 1 -eq 1 ]
> then
> echo "Welcome to Biotrainee() !"
> else echo "**************"
> fi
##> 大于號(hào)是系統(tǒng)自動(dòng)出現(xiàn)感混,表示命令沒有完成
##用雙引號(hào)端幼,雙引號(hào)里變量會(huì)被解釋,單引號(hào)里變量不會(huì)被解釋
可以用一整句代碼完成弧满,用分號(hào)隔開婆跑,if...; then...; else...; fi
if [ 1 -eq 2 ]; then echo "abc"; else echo "123"; fi
##用分號(hào),一整句代碼的好處是庭呜,可以修改滑进。
# 結(jié)合狀態(tài)參數(shù) $?
if [ $? -eq 0 ]
then
touch ok.txt
fi
##$?表示的是上一句代碼是否執(zhí)行成功,為0表示執(zhí)行成功
##有時(shí)候處理需要分成很多步疟赊,通過if語句判斷上一句命令是否成功
##以后自己寫流程寫pipline時(shí)郊供,自己去探索
- 字符串判斷
用法 | 解釋 |
---|---|
[ -z STRING ] | 如果STRING的長度為零則返回為真峡碉,即空是真 |
[ -n STRING ] | 如果STRING的長度非零則返回為真近哟,即非空是真 |
[ STRING1 ] | 如果字符串不為空則返回為真,與-n類似 |
[ STRING1 == STRING2 ] | 如果兩個(gè)字符串相同則返回為真 |
[ STRING1 != STRING2 ] | 如果字符串不相同則返回為真 |
[ STRING1 < STRING2 ] | 如果 STRING1字典排序在STRING2前面則返回為真 > 同理 |
做數(shù)據(jù)處理時(shí)不常用,可能運(yùn)維工程師可能用到鲫寄,做生信分析不常用到吉执。
- 文件判斷
用法 | 解釋 |
---|---|
[ -a FILE ] | 如果 FILE 存在則為真 |
[ -d FILE ] | 如果 FILE 存在且是一個(gè)目錄則返回為真 |
[ -f FILE ] | 如果 FILE 存在且是一個(gè)普通文件則返回為真 |
-a:判斷文件FILE是否存在
-d:是否存在一個(gè)文件夾FIL
-f:判斷一個(gè)普通文件,就是文本文件地来,上一個(gè)流程完成應(yīng)該生成一個(gè)文件戳玫,用if判斷,如果那樣的文件未斑,就可以往下一個(gè)流程走咕宿。
if [ $? -eq 0 ]; then touch ok1.txt; fi
ls
##以上步驟生成一個(gè)ok.txt
# 文件判斷
if [ ! -f ok.txt ]
then
touch ok.txt
fi
循環(huán)語句
for循環(huán)語句
- for循環(huán)語句的常見格式
for i in list
do
commands
done
##list是循環(huán)的條件,一個(gè)樣本提交一個(gè)命令
初學(xué)者if語句用得比較少蜡秽,循環(huán)語句用得比較多府阀。
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
###等差創(chuàng)建10個(gè)文件
list="CDS exon gene start_codon stop_codon transcript UTR"
for i in ${list}
do
echo "This feature is ${i}"
done
##用雙引號(hào),雙引號(hào)里變量會(huì)被解釋芽突,單引號(hào)里變量不會(huì)被解釋
##循環(huán)的結(jié)尾為done
##循環(huán)語句很長時(shí)试浙,賦值給list變量。
自己很好奇寞蚌,因?yàn)閕f語句能寫成一整句代碼田巴,試了看看能不能用循環(huán)也寫成一整句代碼钠糊,結(jié)果是不行,list和分隔符;
不能被識(shí)別追迟,循環(huán)不能寫成一整句代碼熏挎,得一步步來。
- 其它循環(huán)條件表示方法
用優(yōu)先級命令來作為循環(huán)條件逝慧,優(yōu)先級符號(hào)``
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*把這個(gè)結(jié)果作為條件,
###用反引號(hào)``把ls file*括起來啄糙,里面的代碼有最高優(yōu)先級笛臣,`ls file*`會(huì)被優(yōu)先執(zhí)行,把10個(gè)結(jié)果當(dāng)成條件隧饼,放到i in的后面沈堡,i在這10個(gè)條件里循環(huán)
##對10個(gè)文件可以進(jìn)行一些操作,如刪除燕雁,這里演示的是重命名mv ${i} ${i}.txt诞丽,把fiel1..file10重命名為fiel1.txt..file10.txt
while 循環(huán)
- while循環(huán)語句的常見格式:
while read id
do
commands
done
##id相當(dāng)于i,自定義的一個(gè)變量拐格,可以隨便命名僧免,
原來的格式:(比較老,不常用)
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}的后綴名去掉
##單獨(dú)運(yùn)行cat config顯示一個(gè)文件就是單獨(dú)一行捏浊,共10行懂衩,ls file*出的結(jié)果占一行,主要是ls根據(jù)窗口大小去調(diào)金踪。如果把窗口設(shè)置小也是10行浊洞。
ls file* > config
cat config | while read id
do
mv ${id} ${id/txt/csv}
done
ls
##${id/txt/csv}把txt變?yōu)閏sv
##while循環(huán)是怎么傳遞的:
#cat config | while read id,其中cat config 產(chǎn)生10行胡岔,一行就是一個(gè)id
ls file* > config
cat config | while read id
do
mv ${id} ${id.*}
done
ls
while循環(huán)批量去掉文件后綴
while批量給文件加后綴和替換后綴
while循環(huán)結(jié)合*
去掉文件后綴
結(jié)構(gòu)化語句練習(xí):
1.運(yùn)行下面兩句命令
id=example
fastqc ~/Data/${id}.fq
2.用 if 判斷 $? 的是否為0法希,如果是,輸出yes靶瘸,如果否苫亦,輸出no
if [ $? -eq 0 ]
> then
> echo "yes"
> else
> echo "no"
> fi
#yes
##if語句里的[]記得與其它字符之間要有空格
1到2題的答案:
id=example
fastqc ~/Data/${id}.fq
if [ $? -eq 0 ]
then
echo "yes"
else
echo "no"
fi
3.生成10個(gè)文件,file1~10
touch file{1..10}
4.用 while read id 循環(huán)怨咪,在每個(gè)文件中寫入一句話 (提示:echo xxx > ${id} )
#touch file{1..10}
##在第三題上創(chuàng)建的10個(gè)文件進(jìn)行操作
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()!
######以上是自己一步步探索屋剑,作為除學(xué)者,多敲些代碼
ls file* | while read id
> do
> echo "hello welcome to Biotrainee()!" >${id}
> done
cat file1
##>表示重定向惊暴,也可以用>>追加饼丘,添加內(nèi)容
3到4題的答案:
touch file{1..10}
ls file* | while read id
do
echo "xxx" > ${id}
done
- 嘗試批量查看文件
cat fiel{1..10}
##報(bào)錯(cuò),不能這么用
cat file*
##可以查看辽话,對于內(nèi)容簡單的文本肄鸽,可以這么看卫病,要是內(nèi)容多,沒意義典徘,會(huì)刷屏
說明
以上內(nèi)容是聽生信技能樹小郭老師授課內(nèi)容以及參考課件蟀苛。