Linux結(jié)構(gòu)化語句
- 條件語句 if
- 循環(huán)語句: for 循環(huán)和 while循環(huán)
條件語句 if
if 條件語句的常見格式如下,注意空格

有頭有尾,一個if 就要對應(yīng)一個 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
##第二個command是第一個條件不成立之后寫的命令
- 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
##有多少個if就要有多個fi,第一個if與最后一個fi對應(yīng),第二個if與第一個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有時候用=替代,但是規(guī)范的寫法還是-eq;有時候網(wǎng)上教程把[ N1 -eq N2 ]寫成[[ N1 -eq N2 ]]集兩個中括號[[ ]],有時候還有人用小括號(),
示例:
# 數(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
##> 大于號是系統(tǒng)自動出現(xiàn),表示命令沒有完成
##用雙引號,雙引號里變量會被解釋,單引號里變量不會被解釋

可以用一整句代碼完成,用分號隔開,if...; then...; else...; fi
if [ 1 -eq 2 ]; then echo "abc"; else echo "123"; fi
##用分號,一整句代碼的好處是,可以修改。

# 結(jié)合狀態(tài)參數(shù) $?
if [ $? -eq 0 ]
then
touch ok.txt
fi
##$?表示的是上一句代碼是否執(zhí)行成功,為0表示執(zhí)行成功
##有時候處理需要分成很多步,通過if語句判斷上一句命令是否成功
##以后自己寫流程寫pipline時,自己去探索

- 字符串判斷
| 用法 | 解釋 |
|---|---|
| [ -z STRING ] | 如果STRING的長度為零則返回為真,即空是真 |
| [ -n STRING ] | 如果STRING的長度非零則返回為真,即非空是真 |
| [ STRING1 ] | 如果字符串不為空則返回為真,與-n類似 |
| [ STRING1 == STRING2 ] | 如果兩個字符串相同則返回為真 |
| [ STRING1 != STRING2 ] | 如果字符串不相同則返回為真 |
| [ STRING1 < STRING2 ] | 如果 STRING1字典排序在STRING2前面則返回為真 > 同理 |
做數(shù)據(jù)處理時不常用,可能運(yùn)維工程師可能用到,做生信分析不常用到。
- 文件判斷
| 用法 | 解釋 |
|---|---|
| [ -a FILE ] | 如果 FILE 存在則為真 |
| [ -d FILE ] | 如果 FILE 存在且是一個目錄則返回為真 |
| [ -f FILE ] | 如果 FILE 存在且是一個普通文件則返回為真 |
-a:判斷文件FILE是否存在
-d:是否存在一個文件夾FIL
-f:判斷一個普通文件,就是文本文件,上一個流程完成應(yīng)該生成一個文件,用if判斷,如果那樣的文件,就可以往下一個流程走。
if [ $? -eq 0 ]; then touch ok1.txt; fi
ls
##以上步驟生成一個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)的條件,一個樣本提交一個命令
初學(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個文件
list="CDS exon gene start_codon stop_codon transcript UTR"
for i in ${list}
do
echo "This feature is ${i}"
done
##用雙引號,雙引號里變量會被解釋,單引號里變量不會被解釋
##循環(huán)的結(jié)尾為done
##循環(huán)語句很長時,賦值給list變量。

自己很好奇,因?yàn)閕f語句能寫成一整句代碼,試了看看能不能用循環(huán)也寫成一整句代碼,結(jié)果是不行,list和分隔符;不能被識別,循環(huán)不能寫成一整句代碼,得一步步來。

- 其它循環(huán)條件表示方法
用優(yōu)先級命令來作為循環(huán)條件,優(yōu)先級符號``
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*把這個結(jié)果作為條件,
###用反引號``把ls file*括起來,里面的代碼有最高優(yōu)先級,`ls file*`會被優(yōu)先執(zhí)行,把10個結(jié)果當(dāng)成條件,放到i in的后面,i在這10個條件里循環(huán)
##對10個文件可以進(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,自定義的一個變量,可以隨便命名,
原來的格式:(比較老,不常用)
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顯示一個文件就是單獨(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行,一行就是一個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個文件,file1~10
touch file{1..10}

4.用 while read id 循環(huán),在每個文件中寫入一句話 (提示:echo xxx > ${id} )
#touch file{1..10}
##在第三題上創(chuàng)建的10個文件進(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}
##報錯,不能這么用
cat file*
##可以查看,對于內(nèi)容簡單的文本,可以這么看,要是內(nèi)容多,沒意義,會刷屏

說明
以上內(nèi)容是聽生信技能樹小郭老師授課內(nèi)容以及參考課件。