Linux之shell脚本编程

Linux之shell脚本编程

主要内容:

Vim 编辑器

Shell 脚本

任务提交

Vim 编辑器

Vim 编辑器:是从 vi 发展出来的一个文本编辑器。代码补全、 编译及错误跳转等方便编程的功能特别丰富,在程序员中被广 泛使用。(Rstudio,Python里的PC也是编辑器)

Vim 编辑器:工作模式
Vim工作模式示意图
  • 进入vi filename :
    如同打开一个窗口,处于一个命令模式,键盘上的每个按键都是有功能的,每个按键就相当于一个命令,比如按i键,进入书写模式,可以编写脚本了,a和o也是和i一样,可以编写脚本,只学i就可以。

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

  • 输入:wq,实现退出

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编辑的文本

执行脚本

bash file1
bash执行脚本

shell 脚本:为了和普通文本文件区分开,通常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:右
  • 跳转4行或是5行,按4或是5之后按回车

程序员是不用鼠标的,用鼠标效率非常低,所以开发了vim这个软件.

Vim 编辑器帮助文档:

vimtutor zh_CN 可以查看帮助文档

vimtutor zh_CN
#####退出帮助文档:
#按esc(看不到任何提示,留意会听到提示声)
#输入:(英文状态在,shift+:)
#按wq
#按return
vim的帮助文档

Sublime:如果用不惯 vim 编辑器,推荐用 Sublime。
在自己电脑新建一个文本文件,重命名为 test.sh, 右键用 Sublime 打开。或者直接打开 Sublime 然后将文件保存为 test.sh 。在本地编写好脚本后复制粘贴到服务器上。

Sublime的使用

如果不会用vim,在sublime里写好命令(选中会显示命令,参数之间的空格),复制sublime编辑的命令到Linux创建一个文本里粘贴。

第一次把subline命令复制到linux里出现的提示

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

sublime复制命令到Linux的文本

sublime复制命令到linux的文本
查看复制粘贴后运行的结果

sublime是比较好用的本地编辑器,也是可以查看文本文件,比记事本好用很多。

复杂的Shell 脚本

脚本首行的 #! 是Linux的 Shebang 符号,指定解释器(/bin/bash),还有其它解释器:csh,zsh,sh等,最常用的是bash解释器。mac电脑用的linux可能是csh,平时用界面化,可能不太了解地层结构。

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

test.sh

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

$ bash  test.sh
##以上是规范性编写脚本操作 

标准的输入

标准的输入

用bash运行
用bash运行

##在以后数据分析时,可能会有上百到上千句代码,刷屏,看不出,用重定向
# 1标准输出  和  2标准误输出
$ bash  test.sh  1>test.log  2>&1

##log日志,2>&1表示,2和1 一样捕获到的信息都输出到test.log,正确与否都输出到同一个文件里。
##这个例子不是很好理解,以后自行探索
运行日志捕获没有提示

Shell 脚本:

修改shell脚本的文件权限后,可以路径调用

可执行文件

文件权限:

文件权限解释图
ll test.sh
#ls -lh test.sh (这句命令运行也可以)
#-rw-rw-r-- 1 Jan22 Jan22 44 Mar 11 17:10 test.sh
可执行文件
原来文件的属性的权限

修改文件权限

 chmod  764 test.sh 
 ##chmod修改权限的命令,原来是权限是664,现在改为764
 ll test.sh
 ##变为可执行文件,可以被调用,可执行文件就是一个命令
 ~/test.sh
 #Welcome to Biotrainee()!
 #调用时,一定要告诉系统路径,家目录下~/
修改文件属性

文件别修改为可执行文件

权限最大为7,最小为0

 ls -lh test.sh 
# 路径调用可执行文件
./test.sh 
Shell 脚本:参数传递

test2.sh

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

bash  test2.sh  readme.txt
## readme.txt可以是一个文件或是一个参数,文件会被输出到屏幕。也是说cat $1, $1就是传递过来的位置参数的第一个位置参数,readme.txt被代码捕获为$1,就会被调用
##bash  test2.sh  readme.txt($1)$2  $3...readme.txt是第一个参数,可以接着往后放(传参)。
参数传递

传参演示

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)

#####现在修改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)

传参演示

传参

传参

任务提交(重点)

  • nohup不要挂断任务,即把任务提交到服务器上运行

(就是把电脑关了,服务器还在运行)

  • &任务后台运行,通常与 nohup 连用

( nohup与&连用是挂到后台,任务不要断,提交成功了,电脑可以关了)

  • top实时显示系统中各个进程的资源占用状况,按 q 退出

(看看挂后台的任务)

  • htop优化过的 top 命令,界面更美观

  • psProcess Status列出当前系统中运行的进程列表, 一般加 上 –ef 参数,搭配 grep 进行搜索:ps –ef | grep 用户名

(小郭老师非常推荐的命令,因为top或是htop显示非常多用户的程序,会刷屏,一般只关心我们自己运行任务就可以)

  • kill杀掉进程,kill PID

(发现提交的任务是错的,如果在命令行提交,用control C退出;如果任务挂载在服务器后台,每个线程有一个PID,用kill PID杀掉。)

(通常只有管理员才有权限杀掉别人的任务)

test3.sh

cat  >test3.sh
#!/bin/bash
echo  "Start"
sleep  100s
echo  "End"
^C
cat test3.sh
##用vim编辑也可以,或是在subline里编辑后复制粘贴到cat编辑里
bash  test3.sh  
##输入这句命令出现Start,按control C退出
nohup  bash  test3.sh  &
##[1] 10681,数字为PID  运行句代码,每个用户反应的线程数字不一样
##nohup: ignoring input and appending output to 'nohup.通,按回车退出
##提交到nohup.out,在nohup.out查看日志。

bash命令执行sh格式的文件

sh格式的文件的执行

提交后台以及查看正在运行的任务

提交后台以及查看正在运行的任务

提交任务给后台会生成一个nohup.ou日志

提交任务给后台会生成一个nohup.ou日志

提交任务返线程和查看后台运行线程

提交任务返线程和查看后台运行线程

查看提交的任务是否运行完成

查看提交的任务是否完成
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掉,如果子线程和主线程关联性不是很强,杀完主线程后再杀掉子线程

演示杀掉进程

ls
 rm  nohup.out
 ls
 cat test3.sh
# #!/bin/bash
# echo  "Start"
# sleep  100s
# echo  "End"
nohup  bash  test3.sh  &
#[1] 17278
##提交后台任务
 ps -ef | grep Jan22
 ##查看提交任务
 kill 17278
 ##发现提交的任务有问题,用kill命令杀掉
#按enter
# [1]+  Terminated    nohup bash test3.sh显示有一项任务是终止的
ps -ef | grep Jan22
##发现15189在运行,是一个子进程,有时候子进程和主进程的依赖关系不强,kill掉主进程,子进程还在运行,发现有子进程运行,再把子进程kill掉.
kill 17279
ps -ef | grep Jan22
##检车看看运行的进程,主和子线程已经被kill掉
kill主线程和子线程

向服务器提交后台任务,提交成功后,关电脑和退出服务器。任务一直在远端服务器后台运行,和自己的电脑无关。

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,就是退出服务器再次登录,就没法用jobs命令查看,
##jobs当次登录有效
jobs命令演示

其他脚本

在 Linux 中使用其他编程语言,需要在 shebang 中 定义解释器,Python 是 python/python2/python3R 语言是 Rscript用 which 命令找到解释器位置

R 语言脚本
####查看服务器上是否有R语言的解释器
ls 
ls /usr/bin/R*
#/usr/bin/R  /usr/bin/Rscript
##usr前面记得加上路径/,
##Rscrip为R语言解释器

which Rscript
#/usr/bin/script
查看linux服务器里的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里创建R脚本和运行

在Linux里创建R脚本和运行
Python 脚本
cat >test.py 
#!/usr/bin/python3
print("Hello World")
^C

python3 test.py 
#Hello World

如何知道服务器上的python版本

which python
#/trainee/Jan22/miniconda3/bin/python
/trainee/Jan22/miniconda3/bin/python -V
#Python 3.9.7(-V参数查看版本)
 which python3
 #/trainee/Jan22/miniconda3/bin/python3
 which python2
 #/usr/bin/python2
在Linux服务器上查看python的版本

python示例:

Linux运行python脚本示例

扩展

一个自己写的命令:可以实现行列转换,功能类似 R 语言中的 t( ) 函数

在Linux里面相对一个文件进行转置是非常难的。

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

想在Linux里面转置非常难,因为在Linux没有专门转置的命令.

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
##修改权限
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})传参赋值数组类型,理解arr为向量,N=${arr[0]}为向量里第一个元素,T=${arr[1]}为第二个元素。

复杂文件命名,结合所有知识点把冗余信息去掉

###原命名:
Sample-1_20210821_illuminal_Hiseq2000_100_R1.fastq.gz
###要修改为:
Sample-1_fastq.gz
##结合所学的批量修改

服务器

集群(在集群上进行任务调度,有的课题组特别有钱,配的服务器是集群,如果用的是集群服务器,找管理员拿集群服务器的使用方法,比如有哪些节点,如何在集群上提交任务,少部分同学会接触)

(关于集群网的问题:有集群没有网络?建议:下载压缩包本地安装,或是去搜索conda安装的案例-在小环境里安装软件,通过conda打包,复制到集群安装,看看能不能用)

节点

超算(更少部分同学会接触到,类似于天河2号,中大的人可能会用到天河2号)

任务调度系统

还有云服务器:亚马逊,腾讯云,谷歌云,阿里云,我们上课用的是腾讯云(Jan22)

云服务器只能拿来练手,云服务器的资源是非常贵的

https://www.amazonaws.cn/ec2/pricing/ec2-linux-pricing/ (亚马逊中国) https://cloud.google.com/compute/pricing?hl=zh-CN (谷歌云服务器) https://buy.cloud.tencent.com/price/cvm#tab0-list1 (腾讯云服务器) https://www.huaweicloud.com/pricing.html#/ecs (华为云服务器) https://cn.aliyun.com/price/product#/ecs/detail (阿里云服务器)

代办生物信息学服务器(生信技能树)https://mp.weixin.qq.com/s/WT0Qhubrbl_-e7PJbGBlNw

手快有,手慢无(共享96线程384G内存服务器) https://mp.weixin.qq.com/s/gipHRwVnC0asUt9e1IT2Ig

上课服务器账号期限练两个月,可能半年清一次,每个账户磁盘50G。命令常用30个,敲键盘练成肌肉记忆。

Linux总结大纲:

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

说明

以上内容是参加生信技能树小郭老师授课以及摘抄课件内容。

学习Linux总结:在生信技能树听完小郭老师讲的Linux课程,小郭老师讲得比较细,对于初学者非常友好,我是把课程反复听,特别是不太理解的地方,无次数地暂停和重放,很详细地记录笔记,花费的时间很多,很多,把课堂上涉及到的命令都运行了。从输入到输出,经过自己脑海里输出的东西,再次复习时,印象比较深刻,感谢生信技能树和小郭老师!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容