当前位置:首页>Linux>Linux:Shell脚本编程 零基础保姆级笔记

Linux:Shell脚本编程 零基础保姆级笔记

  • 2026-10-11 06:04:40
Linux:Shell脚本编程 零基础保姆级笔记
注:所有学习材料来自生信技能树(卖萌哥主讲,豆包整理补充|所有代码可直接复制运行|全是干货)

内容比较详细,自己使用为主!!

一、课前回顾:Linux系统到底是什么?

Linux 系统:一切皆文件

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

  1. 内核:系统心脏,管内存、CPU、硬盘、网络(你不用碰)
  2. Shell:你和内核说话的翻译官,也是脚本语言(本节课重点)是用户提供操作界面,是用户与内核进行交互操作的接口。
  3. 文件系统:一切皆文件(第一课内容)
  4. 应用程序:fastqc、samtools 等软件

内核、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. 状态变量(判断命令成不成功)

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

只用记一个:$?

  • 输出 0 = 上一条命令 成功
  • 输出 非0 = 上一条命令 失败
# 运行正确命令
ls
echo $?  # 输出 0

# 运行错误命令
aaaaa
echo $?  # 输出 127(代表命令不存在)

如何用 AI 写一个转录组数据分析代码?

4. 位置参数变量(给脚本传参用)

• 位置参数变量:用于向命令或程序脚本中传递信息

脚本里用 $1 $2 $3... 接收外部输入的参数。

  • $0:脚本本身名字
  • $1:第1个参数
  • $#:参数总个数
# 测试脚本 test.sh
#!/bin/bash
echo"脚本名:$0"
echo"第1个参数:$1"
echo"第2个参数:$2"
echo"总参数个数:$#"

运行:

bash test.sh apple banana
  • 参数传递的优点:
  1. 灵活性

  2. 可重用性

  3. 减少错误

5. 一个命令能被执行的三要素:

当我们输入一个命令,之所以能全局地调用,有三个条件要满足:

  1. 这个命令的本体文件真实存在在服务器里

  2. 这个命令的本体文件有可执行的权限 (否则无法被当作命令执行)

  1. 这个命令能被系统查找到(命令所在的路径在$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. 脚本三要素

  1. 第一行必须写:#!/bin/bash(告诉系统用bash运行)

脚本首行的 #! 是Linux的   Shebang 符号,指定解释器

  1. 写你要批量执行的命令
  2. 加可执行权限

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 标准输出:正确结果
  • 2 标准错误:报错信息

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 &
  • nohup:不挂断
  • &:后台运行
  • 输出会存到 nohup.out

查看后台任务

# 看进程
ps -ef | grep $USER

# 停止任务(kill + PID)
kill -9 进程号

实时看日志

tail -f log.txt

八、新手必背10条黄金规则

  1. = 两边不能有空格
  2. **变量调用加 **$
  3. 字符串有空格必须用双引号
  4. if 后面的 [ ] 内外必须有空格
  5. 循环必须用 do ... done
  6. 脚本第一行必须写 #!/bin/bash
  7. 批量文件用 for 循环
  8. 按行读取用 while read
  9. 后台运行一定用 nohup &
  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 $?
查看是否成功

最新文章

随机文章