Linux結(jié)構(gòu)化語句-條件與循環(huán)

Linux結(jié)構(gòu)化語句

  • 條件語句 if
  • 循環(huán)語句: for 循環(huán)和 while循環(huán)

條件語句 if

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數(shù)值判斷示例
if [ 1 -eq 1 ]
> then
> echo "Welcome to Biotrainee() !"
> else echo "**************"
> fi
##> 大于號是系統(tǒng)自動出現(xiàn),表示命令沒有完成
##用雙引號,雙引號里變量會被解釋,單引號里變量不會被解釋
if數(shù)值判斷簡單例子演示

可以用一整句代碼完成,用分號隔開,if...; then...; else...; fi

if [ 1 -eq 2 ]; then echo "abc"; else echo "123"; fi
##用分號,一整句代碼的好處是,可以修改。
if數(shù)值判斷一句代碼
# 結(jié)合狀態(tài)參數(shù) $?
if [ $? -eq 0 ]
then
  touch  ok.txt
fi
##$?表示的是上一句代碼是否執(zhí)行成功,為0表示執(zhí)行成功
##有時候處理需要分成很多步,通過if語句判斷上一句命令是否成功
##以后自己寫流程寫pipline時,自己去探索
結(jié)合狀態(tài)參數(shù) $?示例
  • 字符串判斷
用法 解釋
[ -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

if判斷存在以及創(chuàng)建文件命令

循環(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變量。
循環(huán)語句的演示

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

循環(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
優(yōu)先級循環(huán)方法
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循環(huán)批量去掉文件后綴
while循環(huán)去掉后綴

while批量給文件加后綴和替換后綴

while加后綴和替換后綴

while循環(huán)結(jié)合*去掉文件后綴

while循環(huán)結(jié)合*去掉后綴

結(jié)構(gòu)化語句練習(xí):

1.運(yùn)行下面兩句命令

id=example
fastqc ~/Data/${id}.fq
練習(xí)題1

2.用 if 判斷 $? 的是否為0,如果是,輸出yes,如果否,輸出no

if [ $? -eq 0 ]
> then
> echo "yes"
> else
> echo "no"
> fi
#yes
##if語句里的[]記得與其它字符之間要有空格
結(jié)構(gòu)語句練習(xí)題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}

批量創(chuàng)建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)容
結(jié)構(gòu)化練習(xí)題4

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)容以及參考課件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容