Shell脚本编程
Linux系统环境
Linux系统的4个主要部分:内核、shell、文件系统和应用程序。
- 内核是操作系统的核心,决定系统性能和稳定性
- shell :一种应用程序,是用户和内核交互操作的接口,是套在内核外的壳,内核和用户之间的“翻译官”。
- 系统环境命令:
- 查看CPU信息:
lscpu
- Architecture 架构:x86_64
- CPU(s):几核
- 查看内存信息:
free -h
- 查看硬盘信息:
df -h
/dev/vda1
Mounted on 指挂载在哪个目录
- 查看文件大小:
du -h -d 1
(只展开第一级目录)conda clean -a
清空conda环境中下载的安装包、缓存等
- 查看文件大小:
du -sh ~
(看某个目录的总占大小) - 查看系统进程和命令
top
服务器运行情况q
/Ctrl+c
退出htop
top的升级版,界面更友好,需要安装(conda-forge)。上方的框是线程数量,8个即8线程。支持鼠标操作。jobs
查看后台正在运行的命令,只在当前窗口起效。
- 查看CPU信息:
变量
环境变量、状态变量、位置参数变量、自定义变量,调用变量时,要在变量前面加$
符号
自定义变量
自行定义的变量,可以用于用户编写的脚本,多个命令之间值的传递
a=gene #=前后不要有空格
echo a
## a
echo $a #调用变量要加$
## gene
-
单引号中变量不解释,双引号中变量解释
echo 'This is a $a' ## This is a $a echo "This is a $a" This is a gene
环境变量
用于储存有关shell会话和工作环境的系统变量
$HOME
:当前用户的主目录$PATH
:shell查找命令的目录列表,由冒号(:)分隔$SHELL
:bash shell的全路径名$LOGNAME
:查看当前用户的登录名$PS1
:shell命令行界面的主提示符
状态变量
用于记录命令的运行结果
$?
:获取上一个命令的执行状态返回值,执行成功返回0
,执行不成功时根据情况显示不同数字。用于判断命令执行是否成功。
应用:
if [ $? -eq 0 ]
...
位置参数变量
用于向命令或程序脚本中传递信息
$n
n为数字,$0代表命令本身, 1 − 9 代表第 1 − 9 个参数。 10 以上的参数需要用 包含,如 1-9代表第1-9个参数。10以上的参数需要用{}包含,如 1−9代表第1−9个参数。10以上的参数需要用包含,如{10}。
结构化语句
条件语句 if
模式:
if command1
thencommands
elseif command2thencommandsfi
fi
常见条件:
-
数值判断:
if [ 1 -eq 1 ] #空格很重要! then echo "Hi!" else echo "???" fi
-
字符串判断
应用:
if [ -z $1 ] ##如果第一个参数没有写(为0),则…(可以打印帮助文档等) then ....
-
文件判断
应用:
if [ ! -f ok.txt ] # 如果不存在这个文件,则创建一个 then touch ok.txt fi
循环语句 for
模式:
for i in list
do commands
done
例:
for i in 1 2 3 4 5
do
echo ${i} "Hi!"
sleep 2s
done
-
i(变量)外面要加{},否则容易分辨不出变量
例
a=gene echo $a1 ## echo ${a}1 ## gene1
list的常见格式:
-
list="CDS exon gene" #空格分割 for i in ${list} do echo "This feature is ${i}" #使用双引号,扩展变量 done
-
对文件进行操作
ls file* ## file1 file2 file3 for i in $(ls file*) #等价于`ls file*` do mv ${i} ${i}.txt #重命名 done
循环语句 While
格式:
while read id(变量)
do commands
done
例子:
ls file* | while read id(代指前面ls file*中的每一项)
do
mv ${id} ${id}.txt
done
-
参数扩展:
- 掐头去尾
例:(去尾用的较多)
id=example.test.fq ##定义一个变量
echo ${id#e} ##从头开始,删除第一个e
## xample.test.fq
echo ${id##*e} ##从头开始,删除最后一个e前面的内容
## st.fq
echo ${id%.*} ##从后往前,删除第一个.后面的内容
## example.test
echo ${id%%.*} ##从后往前,删除最后一个.后面的内容
- 替换
例:
id=Data.tar.gz
echo ${id/ta/??}
##Da??.tar.gz
echo ${id//ta/??}
##Da??.t??.gz
脚本编辑
shell脚本:.sh
为后缀的文件大多是脚本文件,可以用bash
命令激活。但 脚本文件不一定要以.sh结尾,内容决定文件格式。
例:
cat openFile.sh
## echo $0
## cat $1
bash openFile.sh readme.txt
## openFile.sh ##echo脚本名字
## README.... ##打印第一个参数
-
释伴(shebang)
脚本文件第一行:
#! /usr/bash
(#!+bash路径)为脚本的释伴(shebang指定解释器),意为当该脚本作为命令执行时,使用哪个命令来解释这个脚本。在Linux中执行其他变成语言时,需要在释伴位置注释语言执行(Rscript/python等)。-
shebang的通用写法
#!/usr/bin/env bash #!/usr/bin/env python #!/usr/bin/env Rscript
-
-
shell脚本直接执行:修改shell脚本的文件权限后(可执行),可以直接通过路径调用。
-
输出执行日志:
1
标准输出流,2
标准误输出流。执行任务后将输出结果1保存到?中,将另一部分输出结果2(大多为错误,不绝对)保存到?中(?可设置)
bash test.sh >out.log #重定向,标准输出流到out.log文件,标准误到屏幕上 bash test.sh 1>test.log 2>error.log #分开重定向,正确与错误分别进入两个log文件 bash test.sh 1>test.log 2>&1 #分开重定向,将2输出到1中,错误有上下文联系
-
提交任务(后台)
nohup
结合&
nohup bash file.sh &
结果默认输出到nohup.log中
htop
查看后台执行的任务tail -f
查看任务执行情况less
按Shift+F
进入浮动模式查看任务执行情况 -
中止后台任务
-
htop
中找到需要停止的任务,点击Kill/按F9/输入9 SIGKILL -
ps -ef #给系统进程拍照 ps -ef | grep 'pattern' #搜索关于pattern的信息,找到目标任务和编号 kill -9 PID #命令杀任务
-
-
重定向后台任务的输出文件,可以用于多个任务后台运行时,分清每个任务的输出文件
nohup bash file.sh > file.log & # 输出一个任务编号 tail -f file.log #看任务执行情况
-
Tips:
;
和&&
均可以连接两个命令,;
前后两个命令独立执行,&&
在前命令执行成功条件下后命令才会执行 -
history
保存了既往写过的命令,可以结合grep
命令搜索写过的命令
推荐学习资料:Bash脚本入门https://wangdoc.com/bash/
引用自生信技