Linux之shell脚本编程

##From 生物技能树

一.Linux系统环境

1.文件系统结构

ps -ef       ##拍一个照,看一下当前拍照下在运行的命令

conda clean -a              ##清楚缓存文件

二.变量

变量 :环境变量、状态变量、位置参数变量、自定义变量,
调用变量时,要在变量前面加一个 $ 符号
环境变量 :用于存储有关 shell 会话和工作环境的 系统变量
状态变量 :用于记录命令的运行结果
位置参数变量 :用于向命令或程序脚本中 传递信息
自定义变量 :由用户自行定义的变量,可用于用户编写的
脚本,多个命令间的值传递等

1.自定义变量

由用户自行定义的变量,可用于用户编写的脚本,多个命令间的值传递等( 注: = 前后不要有空格
单引号 :变量不会被解释

双引号:变量被解释

操作展示:
cat Data/example.gtf |awk '{print $3,$4,$5}' |head    ##用单引号变量不会被解释
cat Data/example.gtf |awk "{print $3,$4,$5}" |head   ##改成双引号,变量被shell提前展开

2.环境变量

环境变量 用于存储有关 shell 会话和工作环境的 系统变量
常见环境变量
$HOME :当前用户的主目录
$PATH shell 查找命令的目录列表,由冒号(
: )分隔。
$SHELL bash shell 的全路径名
$LOGNAME :当前用户的登录名
$PS1 shell 命令行界面的主提示符

2.1.echo

①打印字符串 ②打印变量的值,变量调用要加 $

2.2.$PATH

$PATH 输入命令时 Linux 会去查找 PATH 里面记录的路径,如果命令存在某一个路径中,就可以成功调用。
2.2.1.一个命令能被执行的三个要素

当我们输入一个命令,之所以能全局地调用,有三个条件要满足:
1. 这个命令的本体文件真实存在在服务器里
2. 这个命令的本体文件有可执行的权限 (否则无法被当作命令执行)
3. 这个命令能被系统查找到(命令所在的路径在 $PATH 里有记录,否则无法全局调用,但
可以通过绝对路径 / 相对路径的形式调用)
操作展示:
$PATH 里没有记录,不能全局调用,通过绝对路径/ 相对路径的形式调用命令:
绝对路径:
 which ls    ##找一下ls在哪 ,家目录的bin里
/bin/ls        ##直接使用绝对路径也可以执行
ls           ##也可以直接ls,全局调用
/bin/ls --color=auto  ##ls与该命令一致
相对路径:
ls            ## list 列出当前路径下信息
ll file1  ##查看file1
chmod u+x file1  ##给与可执行权限
./file1    ##使用相对路径执行
直接调用的ls和系统调用的ls为什么长得不一样呢?区别在哪?

差别来自bashrc这个文件。

vim .bashrc   ##vim打开bashrc查看,有颜色展示,找到alias,可给命令起别名,所以系统调用的ls别名是,ls --color=auto,所以我们可以创造出新的自己的命令,它是其他命令的组合,很省事

创造出新的自己的命令:

简写less -SN

vim .bashrc    ##vim打开bashrc, G到底部,o另起一行,进入编辑模式,插入alias le='less -SN',保存并退出

. ~/.bashrc   ##重新加载文件,使其生效

le mymd5    ##即可用le代替less -SN直接查看文件

3.状态变量

状态变量 :用于记录命令的 运行结果

4.位置参数变量

位置参数变量 :用于向命令或程序脚本中 传递信息
操作展示:
$n
vim catfile.sh    ##写一个脚本,里边就写一个内容,cat readme.txt
cat catfile.sh      ##打印文本
bash catfile.sh    ##运行脚本,即可打印出里边的内容
##如果还想打印出内容,但是想换个文件,方法一:重新编辑脚本;方法二:使用位置参数变量,把内容用简单的方式传递进去
vim catfile.sh  ##把脚本重新编辑,改成cat $1
cat catfile.sh    ##命令本身是$0
cat catfile.sh file.md5   ##放什么东西在第二位都会被传递进去 ,file.md5就是$1
写入一个脚本展示多个参数:
vim catfile.sh   ##把脚本重新编辑,写入多个参数
bash catfile.sh readme.txt hi Data/    ##打印readme.txt,echo hi, ls Data/
是否能将三个命令区分:
vim catfile.sh   ##把脚本重新编辑
bash catfile.sh readme.txt hi Data/    ##更改颜色成功

三.结构化语句

条件语句 if
循环语句 for while
参数扩展

1.条件语句 if

if 条件语句的常见条件 数值判断 、字符串判断、文件判断

1.1.数值判断:

操作展示:
空格很重要
;和&&的差别:

pwd ; ls   ##可以将pwd和ls写在一起,可以将多个命令写在一起,之间互不影响

pwd && ls  ##pwd执行成功后才会执行ls,两者有利益相关性

1.2.字符串判断

-Z使用操作展示:

vim fq2fa.sh   ##编辑一个sh文档,内容如下:

cat fq2fa.sh    ##查看

 bash fq2fa.sh    ##给一个帮助文档

bash fq2fa.sh Data/example.fq > tmp.fa   ##根据帮助文档,添加内容

less -SN tmp.fa  

seqkitseqtk两个命令,可用conda安装,针对fastq文件

1.3.文件判断

2.循环语句 for while

2.1.for循环语句的常见格式

变量要加{},否则容易 分辨不出变量

操作展示:


for i in {1..10}            ##通过循环生成10个文件
> do
> touch files${i}      ##变量要加{},否则容易 分辨不出变量

> done


##变量要加{},否则容易 分辨不出变量


list可以写变量:

ls                 ##

ls file*         ##查看所有file文件

for i in $(ls file*)          ##  使用for循环
> do
> mv ${i} ${i}.txt
> done                     

ls                         ##查看

2.2.while循环语句的常见格式

使用while循环在所有file文件夹后边加.txt


新建一个文件夹,把所有file文件放进去,通过管道符传递给while循环,更改file文件后缀:

新知识点:参数扩展

2.3.参数扩展

作用: 掐头去尾
生成一个变量:
一般来说, 去尾 比掐头更常用, * 代表任意一个任何字符

去尾的同时,还可以进行后缀替换:

echo ${id%%.*}.fa     ##加入fa的后缀

id=Da ta . ta r.gz

2.4.练习

1.练习操作

2.如下


1.

2.

3.先用for循环建文件夹

while循环写入东西:

四.Shell 脚本编程

1.Shell 脚本

shell 脚本 :为了和普通文本文件区分开,通常 shell 脚本都会以 .sh 为后缀名
其他脚本 :在 Linux 中使用其他编程语言,需要在 shebang( 释伴) 中定义解释器, Python python/python2/python3 R 语言是 Rscript ,用 which 命令找到解释器位置
shebang 扩展 :如何解决不同的平台或者不同的设备下的差异 ?
shebang 通用写法 :
#!/usr/bin/env bash
#!/usr/bin/env python
#!/usr/bin/env Rscript
env 的位置相对固定 , env 去调用当前环境下的编译器
其他脚本

Shell 脚本 :修改 shell 脚本的文件权限后,可以 直接通过路径调用( 即充当 command 的作用 )
Shell 脚本 :参数传递
输出:运行脚本的时候会有一些输出,我们应该把这些输出保存下来,因为输出文件很重要,有一些错误或者统计信息,所以要把日志信息保存下来,日志有两个管道来控制,通过 标准输出流 打印到屏幕上, 标准 输出流 把一些error输出到屏幕上
1: 标准输出流
2:标准 输出流
##1重定向给他test.log,2重定向给1,即把标准输出和便准误输出合并到同一个文件里

##第一种方式不推荐:因为直接输出到屏幕上,退出后就没了
##推荐第三和四种方式,保存错误和正确的日志,一个分开保存,但会分开保存会丢失上下文信息,一个一起保存

2.任务提交:(重点

是在前台提交的:

nohup :不要挂断任务,即把任务提交到服务器上运行
& :任务后台运行,通常与 nohup 连用
top :实时显示系统中各个进程的资源占用状况,按 q 退出
htop :优化过的 top 命令,界面更美观      ##里边内容很多,进去后,点个u,显示出所有的user,选中自己,回车,查看自己在运行的任务,也可直接htop -u,进去直接查看,进去只显示user
ps
Process Status 列出当前系统中运行的进程列表, 一般加
–ef 参数,搭配 grep 进行搜索: ps –ef | grep 用户名
kill :杀掉进程, kill -9 PID    (sigkill), 回车杀掉任务
tail 动态查看输出结果
tail -f <log file>     ctrl+c退出
less 的动态查看
less <log file> → shift+F
top 或者 htop 进行任务监视
top/htop
vim test.sh            ##创建一个,写个for循环
for i in {1..600}      
do
        echo ${i}
        sleep 3s
done
bash test.sh                   ##运行该脚本
nohup bash test.sh &     ##放在服务器上运行,如果只运行一个,会默认的把所有东西写到nohup.out里面
cat nohup.out      
tail -f nohup.out    ##浮动的查看输出
htop nohup.out     ##进去杀掉任务

nohup bash test.sh > test.log &     ##如果运行多个,手动指定标准输出,标准误输出nohup会帮忙解决


ps -ef |grep 'Apr4311'    ##使用ps -ef,使用grep抓取自己用户的正在运行的命令


kill -9 PID     ##杀掉进程


五.推荐的bash的教程?

1. 阮一峰的 bash 脚本教程
https://wangdoc.com/bash/
2. 鸟哥的 Linux 私房菜:基础学习篇 第四版 ( 12 )
https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/104.html
3.生信学习——Linux必做20题(附详细答案解读)
  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值