注:所有学习材料来自生信技能树(卖萌哥主讲,豆包整理补充|所有代码可直接复制运行|全是干货)内容比较详细,自己使用为主!!
一、课前回顾:Linux系统到底是什么?
Linux 系统:一切皆文件

Linux = 内核 + Shell + 文件系统 + 应用程序

- 内核:系统心脏,管内存、CPU、硬盘、网络(你不用碰)
- Shell:你和内核说话的翻译官,也是脚本语言(本节课重点)是用户提供操作界面,是用户与内核进行交互操作的接口。
内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
本节课核心
把多行命令写成一个脚本 → 一键运行 → 解放双手
这是生信自动化分析的基础中的基础。


二、变量:Shell里的“小盒子”
变量:环境变量、状态变量、位置参数变量、 自定义变量,调用变量时, 要在变量前面加一个 $ 符号
变量就是存数据的盒子,用的时候加 $ 取出来。

1. 自定义变量(最常用)
自定义变量:由用户自行定义的变量, 可用于用户编写的脚
规则:
# 1. 创建变量(存一个基因名)
gene=TP53
# 2. 错误写法(有空格,必报错)
# gene = TP53
# 3. 查看变量(必须加 $)
echo$gene
# 输出:TP53
# 4. 单引号 vs 双引号(超级重要)
echo'基因是 $gene'# 单引号:原样输出,不解析变量
echo"基因是 $gene"# 双引号:解析变量,输出真实值
2. 环境变量(系统自带,管全局)
系统提前给你建好的变量,大写。
环境变量:用于存储有关shell会话和工作环境的系统变量
• $HOME:当前用户的主目录
• $PATH:shell查找命令的目录列表, 由冒号( :)分隔。
输入命令时Linux会去查找PATH里面记录的路径, 如果命令存在某一个路径中,就可以成功调用。
• $SHELL:bash shell的全路径名
• $LOGNAME:当前用户的登录名
• $PS1:shell命令行界面的主提示符
# 最常用5个环境变量
echo$HOME# 你的家目录
echo$USER# 你的用户名
echo$PATH# 命令查找路径(第四课重点)
echo$PWD# 当前所在目录
echo$SHELL# 当前用的Shell

这串代码,外面是单引号,里面双引号进行设置,对文字,时间,变 2 行,颜色等进行设置
3. 状态变量(判断命令成不成功)
状态变量:用于记录命令的运行结果

只用记一个:$?
# 运行正确命令
ls
echo $? # 输出 0
# 运行错误命令
aaaaa
echo $? # 输出 127(代表命令不存在)
如何用 AI 写一个转录组数据分析代码?
4. 位置参数变量(给脚本传参用)
• 位置参数变量:用于向命令或程序脚本中传递信息

脚本里用 $1 $2 $3... 接收外部输入的参数。
# 测试脚本 test.sh
#!/bin/bash
echo"脚本名:$0"
echo"第1个参数:$1"
echo"第2个参数:$2"
echo"总参数个数:$#"
运行:
bash test.sh apple banana
5. 一个命令能被执行的三要素:
当我们输入一个命令,之所以能全局地调用,有三个条件要满足:
这个命令的本体文件有可执行的权限 (否则无法被当作命令执行)

- 这个命令能被系统查找到(命令所在的路径在$PATH里有记录,否则无法全局调用,但 可以通过绝对路径/相对路径的形式调用)
三、结构化语句:让脚本“会思考、会重复”
1. if 判断:满足条件才执行

fi 是代表括号的意思
格式(注意空格与缩进):嵌套
if [ 条件 ]; then
命令
elif [ 条件 ]; then
命令
else
命令
fi
最常用3类判断
① 数字判断

-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
② 文件判断

-f 文件存在且是普通文件
-d 目录存在
-z 字符串为空
③ 字符串判断

== 等于
!= 不等于
新手示例
# 判断文件是否存在
if [ -f readme.txt ]; then
echo"文件存在"
else
echo"文件不存在"
fi
2. for 循环:重复做事(生信最常用)

格式
for 变量 in 列表
do
命令
done
变量要加{},否则容易分辨不出变量
实战1:批量创建10个文件
for i in {1..10}
do
touch file${i}
done
实战2:批量给文件加后缀

for i in file*
do
mv ${i}${i}.txt
done
实战3:批量运行fastqc(生信真实场景)
for fq in *.fastq.gz
do
fastqc $fq
done
3. while 循环:按行读取文件

适合样本名列表、配置文件。
# 按行读取 config.txt,逐行处理
cat config.txt | whileread id
do
echo"正在处理:$id"
done

四、参数扩展:批量改名/改后缀(神器)

不用sed、不用awk,Shell自带批量改名!

1. 去后缀(最常用)
一般生信分析不要改前缀,一般是改后缀

# 例子:文件名 file1.txt
file=file1.txt
# 从尾巴删最短匹配 .txt
echo${file%.txt}# 输出 file1
# 通用:去掉所有后缀(.gz .fa .fq 都能用)
echo${file%.*}
2. 替换字符串

name=SRR1234567.fq.gz
# 替换第一个 fq → bam
echo${name/fq/bam}
# 替换所有 fq → bam
echo${name//fq/bam}
# 只改后缀 → .bam
echo${name%.fq.gz}.bam
五、Shell 脚本:从0到1写一个可运行脚本
shell 脚本:为了和普通文本文件区分开, 通常shell脚本都会以 .sh 为后缀名
1. 脚本三要素
- 第一行必须写:
#!/bin/bash(告诉系统用bash运行)
脚本首行的 #! 是Linux的 Shebang 符号,指定解释器
2. 最简单脚本示例
# 1. 创建脚本
vim run.sh
写入内容:
#!/bin/bash
echo"开始分析..."
date
ls
echo"分析结束!"
3. 运行脚本(两种方法)
# 方法1:直接bash运行(最简单,新手推荐)
bash run.sh
# 方法2:加权限后直接运行
chmod +x run.sh # +x = 加可执行权限
./run.sh # 运行
六、重定向:把输出存进文件(不刷屏)
命令运行会产生两种输出:
1. 最常用3种写法
# 1. 只保存正确结果
bash run.sh > log.txt
# 2. 正确+错误都保存(生信必备)
bash run.sh > log.txt 2>&1
# 3. 追加(不覆盖原来内容)
bash run.sh >> log.txt 2>&1
七、后台运行:关终端也能跑(服务器神器)

命令:nohup + &
nohup bash run.sh > log.txt 2>&1 &
查看后台任务
# 看进程
ps -ef | grep $USER
# 停止任务(kill + PID)
kill -9 进程号
实时看日志
tail -f log.txt
八、新手必背10条黄金规则
九、课堂练习(逐题答案,直接复制)
1. for循环生成 file1~file10
for i in {1..10}; do touch file$i; done
2. while循环给每个文件写内容
ls file* > config.txt
cat config.txt | whileread id; doecho"hello" > $id; done
3. 生成 SRR1234501~SRR1234510
for i in {01..10}; doecho SRR12345$i >> download.txt; done
4. 批量生成下载脚本
cat download.txt | whileread id; doecho"kingfisher get -r $id -m aws-http" >> download.sh; done
5. 变量修改 ID & 后缀
sra_id="SRR1234567.fq.gz"
# 改成 SRR1234500
echo${sra_id/567/500}
# 后缀改成 .bam
echo${sra_id%.fq.gz}.bam
十、命令速查表(打印贴电脑)
| |
|---|
var=value | |
echo $var | |
for i in *; do ... done | |
while read id; do ... done | |
${file%.txt} | |
if [ -f file ]; then ... fi | |
bash xxx.sh | |
chmod +x xxx.sh | |
nohup bash xxx.sh & | |
echo $? | |