Linux之shell腳本編程

Linux之shell腳本編程

主要內(nèi)容:

? Vim 編輯器

? Shell 腳本

? 任務(wù)提交

Vim 編輯器

Vim 編輯器:是從 vi 發(fā)展出來的一個文本編輯器。代碼補全、 編譯及錯誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣 泛使用。(Rstudio,Python里的PC也是編輯器)

Vim 編輯器:工作模式
Vim工作模式示意圖
  • 進入vi filename :
    如同打開一個窗口,處于一個命令模式,鍵盤上的每個按鍵都是有功能的,每個按鍵就相當于一個命令,比如按i鍵,進入書寫模式,可以編寫腳本了,a和o也是和i一樣,可以編寫腳本,只學i就可以。

  • 要退出或是保存,按ESC:就是返回命令模式

  • 輸入:wq,實現(xiàn)退出

vim file1
###file1可以是存在或是不存在的
#底線顯示”file1“ [New File]
#按i進入輸入(insert)模式,底邊顯”insert“就可以輸入腳本
echo "Welcome to Biotrainee()!"
#按ESC進入命令模式,底線的”insert“不見
#按:進入底線模式,看到光標
#然后輸入 wq ,按回車(return)退出,w是保存,q是退出

##鍵盤上的其它按鍵的功能先不要學

vim file1
#按i
please learn step by step
if you have any question
please contact with us by email
thank you!
#按esc
#按:
#輸入wq
#按return

vim按i鍵編輯

vim按i鍵編輯

vim先按esc返回命令模式,按:wq退出

vim退出步驟演示

查看編輯好的文本

查看用vim編輯的文本

執(zhí)行腳本

bash file1
bash執(zhí)行腳本

shell 腳本:為了和普通文本文件區(qū)分開,通常shell腳本都 會以 .sh為后綴名.

R 語言腳本:.R為后綴名

Python 腳本:.py為后綴名

后綴名沒有多大作用,提示人想起是什么腳本。

vim命令模式下鍵盤的功能

http://www.viemu.com/(英文版)

https://blog.51cto.com/eminzhang/1254276(中文版)

vim鍵盤圖

使用vim命令時,鍵盤上一些鍵的用法:

vim filename后進行操作

  • 刪除:
    刪除一行按兩個次d就是dd
    刪除兩行按2dd
  • 撤銷:
    按一次u,撤銷一次
    按兩次u,撤銷2次
  • 復制:
    按y
  • 粘貼:
    按p
  • 上下左右:
    h:左
    j:下
    k:上
    l:右
  • 跳轉(zhuǎn)4行或是5行,按4或是5之后按回車

程序員是不用鼠標的,用鼠標效率非常低,所以開發(fā)了vim這個軟件.

Vim 編輯器幫助文檔:

vimtutor zh_CN 可以查看幫助文檔

vimtutor zh_CN
#####退出幫助文檔:
#按esc(看不到任何提示,留意會聽到提示聲)
#輸入:(英文狀態(tài)在,shift+:)
#按wq
#按return
vim的幫助文檔

Sublime:如果用不慣 vim 編輯器,推薦用 Sublime。
在自己電腦新建一個文本文件,重命名為 test.sh, 右鍵用 Sublime 打開。或者直接打開 Sublime 然后將文件保存為 test.sh 。在本地編寫好腳本后復制粘貼到服務(wù)器上。

Sublime的使用

如果不會用vim,在sublime里寫好命令(選中會顯示命令,參數(shù)之間的空格),復制sublime編輯的命令到Linux創(chuàng)建一個文本里粘貼。

第一次把subline命令復制到linux里出現(xiàn)的提示

第一次把subline命令復制到Linux里

sublime復制命令到Linux的文本

sublime復制命令到linux的文本
查看復制粘貼后運行的結(jié)果

sublime是比較好用的本地編輯器,也是可以查看文本文件,比記事本好用很多。

復雜的Shell 腳本

腳本首行的 #! 是Linux的 Shebang 符號,指定解釋器(/bin/bash),還有其它解釋器:csh,zsh,sh等,最常用的是bash解釋器。mac電腦用的linux可能是csh,平時用界面化,可能不太了解地層結(jié)構(gòu)。

##首行的 #!
##指定解釋器:/bin/bash
#!/bin/bash

test.sh

$ vim  test.sh
#!/bin/bash
echo "Welcome to Biotrainee() !"

$ bash  test.sh
##以上是規(guī)范性編寫腳本操作 

標準的輸入

標準的輸入

用bash運行
用bash運行

##在以后數(shù)據(jù)分析時,可能會有上百到上千句代碼,刷屏,看不出,用重定向
# 1標準輸出  和  2標準誤輸出
$ bash  test.sh  1>test.log  2>&1

##log日志,2>&1表示,2和1 一樣捕獲到的信息都輸出到test.log,正確與否都輸出到同一個文件里。
##這個例子不是很好理解,以后自行探索
運行日志捕獲沒有提示

Shell 腳本:

修改shell腳本的文件權(quán)限后,可以路徑調(diào)用。

可執(zhí)行文件

文件權(quán)限:

文件權(quán)限解釋圖
ll test.sh
#ls -lh test.sh (這句命令運行也可以)
#-rw-rw-r-- 1 Jan22 Jan22 44 Mar 11 17:10 test.sh
可執(zhí)行文件
原來文件的屬性的權(quán)限

修改文件權(quán)限

 chmod  764 test.sh 
 ##chmod修改權(quán)限的命令,原來是權(quán)限是664,現(xiàn)在改為764
 ll test.sh
 ##變?yōu)榭蓤?zhí)行文件,可以被調(diào)用,可執(zhí)行文件就是一個命令
 ~/test.sh
 #Welcome to Biotrainee()!
 #調(diào)用時,一定要告訴系統(tǒng)路徑,家目錄下~/
修改文件屬性

文件別修改為可執(zhí)行文件

權(quán)限最大為7,最小為0

 ls -lh test.sh 
# 路徑調(diào)用可執(zhí)行文件
./test.sh 
Shell 腳本:參數(shù)傳遞

test2.sh

cat  test2.sh
#!/bin/bash
cat  $1

bash  test2.sh  readme.txt
## readme.txt可以是一個文件或是一個參數(shù),文件會被輸出到屏幕。也是說cat $1, $1就是傳遞過來的位置參數(shù)的第一個位置參數(shù),readme.txt被代碼捕獲為$1,就會被調(diào)用
##bash  test2.sh  readme.txt($1)$2  $3...readme.txt是第一個參數(shù),可以接著往后放(傳參)。
參數(shù)傳遞

傳參演示

cat >test2_1.sh
#!/bin/bash
cat readme.txt
^C

cat test2_1.sh
#!/bin/bash
cat readme.txt

bash test2_1.sh
#Welcome to Biotrainee() !
#This is your personal account in our Cloud.
#Have a fun with it.
#Please feel free to contact with me( email to jmzeng1314@163.com )
#(http://www.biotrainee.com/thread-1376-1-1.html)

#####現(xiàn)在修改test2_1.sh把cat readme.txt改為cat $1
cat test2_1.sh
#!/bin/bash
cat $1
bash test2_1.sh readme.txt
# Welcome to Biotrainee() !
#   This is your personal account in our Cloud.
# Have a fun with it.
# Please feel free to contact with me( email to jmzeng1314@163.com )
# (http://www.biotrainee.com/thread-1376-1-1.html)

傳參演示

傳參

傳參

任務(wù)提交(重點)

  • nohup不要掛斷任務(wù),即把任務(wù)提交到服務(wù)器上運行

(就是把電腦關(guān)了,服務(wù)器還在運行)

  • &任務(wù)后臺運行,通常與 nohup 連用

( nohup與&連用是掛到后臺,任務(wù)不要斷,提交成功了,電腦可以關(guān)了)

  • top實時顯示系統(tǒng)中各個進程的資源占用狀況,按 q 退出

(看看掛后臺的任務(wù))

  • htop優(yōu)化過的 top 命令,界面更美觀

  • psProcess Status列出當前系統(tǒng)中運行的進程列表, 一般加 上 –ef 參數(shù),搭配 grep 進行搜索:ps –ef | grep 用戶名

(小郭老師非常推薦的命令,因為top或是htop顯示非常多用戶的程序,會刷屏,一般只關(guān)心我們自己運行任務(wù)就可以)

  • kill殺掉進程,kill PID

(發(fā)現(xiàn)提交的任務(wù)是錯的,如果在命令行提交,用control C退出;如果任務(wù)掛載在服務(wù)器后臺,每個線程有一個PID,用kill PID殺掉。)

(通常只有管理員才有權(quán)限殺掉別人的任務(wù))

test3.sh

cat  >test3.sh
#!/bin/bash
echo  "Start"
sleep  100s
echo  "End"
^C
cat test3.sh
##用vim編輯也可以,或是在subline里編輯后復制粘貼到cat編輯里
bash  test3.sh  
##輸入這句命令出現(xiàn)Start,按control C退出
nohup  bash  test3.sh  &
##[1] 10681,數(shù)字為PID  運行句代碼,每個用戶反應(yīng)的線程數(shù)字不一樣
##nohup: ignoring input and appending output to 'nohup.通,按回車退出
##提交到nohup.out,在nohup.out查看日志。

bash命令執(zhí)行sh格式的文件

sh格式的文件的執(zhí)行

提交后臺以及查看正在運行的任務(wù)

提交后臺以及查看正在運行的任務(wù)

提交任務(wù)給后臺會生成一個nohup.ou日志

提交任務(wù)給后臺會生成一個nohup.ou日志

提交任務(wù)返線程和查看后臺運行線程

提交任務(wù)返線程和查看后臺運行線程

查看提交的任務(wù)是否運行完成

查看提交的任務(wù)是否完成
ls
cat nohup.out
cat test3.sh

nohup  bash  test3.sh   1>test3.log  2>&1  &
###nohup和&在最外層表示的是把提交到后臺,中間bash  test3.sh   1>test3.log  2>&1表示bash 了一個腳本,1>test3.log,1捕獲正確輸出到test3.log文件,2>&1,2捕獲錯誤輸出到1里面。也可以把2>&1改為2>2.log,即輸出到另外一個文件。

top

ps -ef | grep test3

用cat命令查看后臺提交運行的命令

cat看后臺提交運行的命令

一般只要把主進程kill掉,子進程也會被kill掉,如果子線程和主線程關(guān)聯(lián)性不是很強,殺完主線程后再殺掉子線程。

演示殺掉進程

ls
 rm  nohup.out
 ls
 cat test3.sh
# #!/bin/bash
# echo  "Start"
# sleep  100s
# echo  "End"
nohup  bash  test3.sh  &
#[1] 17278
##提交后臺任務(wù)
 ps -ef | grep Jan22
 ##查看提交任務(wù)
 kill 17278
 ##發(fā)現(xiàn)提交的任務(wù)有問題,用kill命令殺掉
#按enter
# [1]+  Terminated    nohup bash test3.sh顯示有一項任務(wù)是終止的
ps -ef | grep Jan22
##發(fā)現(xiàn)15189在運行,是一個子進程,有時候子進程和主進程的依賴關(guān)系不強,kill掉主進程,子進程還在運行,發(fā)現(xiàn)有子進程運行,再把子進程kill掉.
kill 17279
ps -ef | grep Jan22
##檢車看看運行的進程,主和子線程已經(jīng)被kill掉
kill主線程和子線程

向服務(wù)器提交后臺任務(wù),提交成功后,關(guān)電腦和退出服務(wù)器。任務(wù)一直在遠端服務(wù)器后臺運行,和自己的電腦無關(guān)。

nohup  bash  test3.sh  &
ps -ef | grep Jan22

jobs命令

nohup  bash  test3.sh  &
#[1] 21486
#nohup: ignoring input and appending output to 'nohup.out'
^C
 jobs
#[1]+  Running                 nohup bash test3.sh &
##jobs有一個bug,就是退出服務(wù)器再次登錄,就沒法用jobs命令查看,
##jobs當次登錄有效
jobs命令演示

其他腳本

在 Linux 中使用其他編程語言,需要在 shebang 中 定義解釋器,Python 是 python/python2/python3, R 語言是 Rscript,用 which 命令找到解釋器位置

R 語言腳本
####查看服務(wù)器上是否有R語言的解釋器
ls 
ls /usr/bin/R*
#/usr/bin/R  /usr/bin/Rscript
##usr前面記得加上路徑/,
##Rscrip為R語言解釋器

which Rscript
#/usr/bin/script
查看linux服務(wù)器里的R語言解釋器

which Rscript查看路徑


which Rscript

R 語言示例:

cat >test.R 
#!/usr/bin/Rscript
a = 1:10
paste0("gene",a)

Rscript test.R 
 [1] "gene1"  "gene2"  "gene3"  "gene4"  "gene5"  
 [6] "gene6"  "gene7"  "gene8"  "gene9"  "gene10"

在linux里創(chuàng)建R腳本和運行

在Linux里創(chuàng)建R腳本和運行
Python 腳本
cat >test.py 
#!/usr/bin/python3
print("Hello World")
^C

python3 test.py 
#Hello World

如何知道服務(wù)器上的python版本

which python
#/trainee/Jan22/miniconda3/bin/python
/trainee/Jan22/miniconda3/bin/python -V
#Python 3.9.7(-V參數(shù)查看版本)
 which python3
 #/trainee/Jan22/miniconda3/bin/python3
 which python2
 #/usr/bin/python2
在Linux服務(wù)器上查看python的版本

python示例:

Linux運行python腳本示例

擴展

一個自己寫的命令:可以實現(xiàn)行列轉(zhuǎn)換,功能類似 R 語言中的 t( ) 函數(shù)

在Linux里面相對一個文件進行轉(zhuǎn)置是非常難的。

head -2 Data/example.gtf
head -2 Data/example.gtf | cut -f 1-5

想在Linux里面轉(zhuǎn)置非常難,因為在Linux沒有專門轉(zhuǎn)置的命令.

cat  > row2col
awk 'BEGIN{FS="\t";OFS="\t"}{i=1;while(i <= NF){col[i]=col[i] $i "\t";i=i+1}} END {i=1;while(i<=NF){print i,col[i];i=i+1}}'
##用awk寫一個腳本
chmod 764  row2col
##修改權(quán)限
mv  row2col  ~/bin
##保存到~/bin里
head -n 2 ~/Data/example.gtf  |  row2col

補充的知識點:

cat >config
Normal1 Tumor1
Normal2 Tumor2
Normal1 Tumor1

cat config | while read id
do
arr=(${id})
N=${arr[0]}
T=${arr[1]}
##對配對樣本進行某種處理
xxx -tumor ${T} -normal -${N}
done

每個id有一行,一個Normal1,一個Tumor1。arr=(${id})傳參賦值數(shù)組類型,理解arr為向量,N=${arr[0]}為向量里第一個元素,T=${arr[1]}為第二個元素。

復雜文件命名,結(jié)合所有知識點把冗余信息去掉

###原命名:
Sample-1_20210821_illuminal_Hiseq2000_100_R1.fastq.gz
###要修改為:
Sample-1_fastq.gz
##結(jié)合所學的批量修改

服務(wù)器

? 集群(在集群上進行任務(wù)調(diào)度,有的課題組特別有錢,配的服務(wù)器是集群,如果用的是集群服務(wù)器,找管理員拿集群服務(wù)器的使用方法,比如有哪些節(jié)點,如何在集群上提交任務(wù),少部分同學會接觸)

(關(guān)于集群網(wǎng)的問題:有集群沒有網(wǎng)絡(luò)?建議:下載壓縮包本地安裝,或是去搜索conda安裝的案例-在小環(huán)境里安裝軟件,通過conda打包,復制到集群安裝,看看能不能用)

? 節(jié)點

? 超算(更少部分同學會接觸到,類似于天河2號,中大的人可能會用到天河2號)

? 任務(wù)調(diào)度系統(tǒng)

還有云服務(wù)器:亞馬遜,騰訊云,谷歌云,阿里云,我們上課用的是騰訊云(Jan22)

云服務(wù)器只能拿來練手,云服務(wù)器的資源是非常貴的

https://www.amazonaws.cn/ec2/pricing/ec2-linux-pricing/ (亞馬遜中國) https://cloud.google.com/compute/pricing?hl=zh-CN (谷歌云服務(wù)器) https://buy.cloud.tencent.com/price/cvm#tab0-list1 (騰訊云服務(wù)器) https://www.huaweicloud.com/pricing.html#/ecs (華為云服務(wù)器) https://cn.aliyun.com/price/product#/ecs/detail (阿里云服務(wù)器)

代辦生物信息學服務(wù)器(生信技能樹)https://mp.weixin.qq.com/s/WT0Qhubrbl_-e7PJbGBlNw

手快有,手慢無(共享96線程384G內(nèi)存服務(wù)器) https://mp.weixin.qq.com/s/gipHRwVnC0asUt9e1IT2Ig

上課服務(wù)器賬號期限練兩個月,可能半年清一次,每個賬戶磁盤50G。命令常用30個,敲鍵盤練成肌肉記憶。

Linux總結(jié)大綱:

https://mubu.com/doc/2OmhIGZqmcj

說明

以上內(nèi)容是參加生信技能樹小郭老師授課以及摘抄課件內(nèi)容。

學習Linux總結(jié):在生信技能樹聽完小郭老師講的Linux課程,小郭老師講得比較細,對于初學者非常友好,我是把課程反復聽,特別是不太理解的地方,無次數(shù)地暫停和重放,很詳細地記錄筆記,花費的時間很多,很多,把課堂上涉及到的命令都運行了。從輸入到輸出,經(jīng)過自己腦海里輸出的東西,再次復習時,印象比較深刻,感謝生信技能樹和小郭老師!

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

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

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