目录
一、Shell 脚本概述
1.Shell 的含义
-
定义:
Shell 是用户与操作系统内核(Kernel)之间的“翻译官”,负责将用户输入的命令解析为内核能理解的指令,并将执行结果返回给用户。
-
本质:
-
命令行解释器(CLI),支持交互式操作(逐行输入命令)和脚本化执行(批量处理命令)。
-
用户空间程序(非内核组件),通过系统调用与内核交互。
-
- 流程:用户命令 → Shell(解释器) → 内核(执行) → 结果 → Shell → 用户
2.Shell 的作用
常见类型:
-
Bash:Linux 默认 Shell(Bourne-Again Shell),功能丰富。
-
Zsh:支持更强大的自动补全和主题定制(如 Oh My Zsh)。
-
Fish:语法友好,适合新手
Shell 是操控系统的“遥控器”+“自动化流水线”,让用户通过命令和脚本高效管理系统、处理数据、解放双手。
二、Shell 脚本的基本操作编写
1.编写一个脚本
(1)新建脚本
- vim first.sh //创建名为first的脚本文件
- 添加 Shebang 声明(指定解释器):#!/bin/bash # 必须放在脚本第一行
- 编写命令
- 保存并退出(如用 Vim:按
Esc
→:wq
)。
(2)执行脚本命令
直接用当前shell执行
- source aa.sh
- . aa.sh
打开一个shell,执行脚本指令,然后退出该子Shell
- ./aa.sh (需赋予执行权限chmod +x )
# 通过路径执行(需 Shebang 声明)- bash aa.sh
- sh aa.sh
2.重定向与管道符操作
(1)重定向操作
注意:
0
标准输入,1
标准输出,2
标准错误(不可省略)。
重定向会破坏文件原有内容(>
尤其危险,慎用!)。
-
输出重定向:
-
>
:覆盖写入文件echo "Hello" > output.txt # 创建或清空文件后写入
-
>>
:追加写入文件echo "World" >> output.txt # 追加内容到文件末尾
-
-
输入重定向:
wc -l < input.txt # 从文件读取输入(统计行数)
-
错误重定向:
ls nofile 2> error.log # 将错误信息写入 error.log ls nofile &> all.log # 同时重定向标准输出和错误
大致总结:
命令 > 文件 → 输出覆盖到文件 命令 >> 文件 → 输出追加到文件 命令1 | 命令2 → 命令1的输出作为命令2的输入
(2)管道符操作
-
管道符
|
:将前一个命令的标准输出传递给后一个命令的标准输入。cat log.txt | grep "error" | wc -l # 分解: # 1. 读取 log.txt # 2. 过滤包含 "error" 的行 # 3. 统计行数
-
用法:
结合
grep
、awk
、sed
处理文本。
awk
-F(间隔符)'{print (位置变量)}' :过滤列grep :过滤行
sed :
批量处理文件名(如 df -hT | grep"/$" | awk '{print $6}' )。
三、Shell 变量的作用、类型
1.自定义变量
(1)定义新的变量
-
基本语法:
变量名="变量值" # 等号两侧不能有空格!
-
变量命名规则:
-
字母/数字/下划线组成,不能以数字开头。
-
区分大小写
-
(2)查看和引用变量的值
-
查看变量:
echo $user # 输出变量值,"$" 是引用变量的值,加在变量名前 echo ${user} 2.5 #“ {} ” 变量名的边界 ,可以避免与紧随其后的其他字符混淆
-
删除变量:
unset 变量名 #慎用
(3)变量赋值的特殊操作
-
基本方法:在等号“=”后面直接指定变量内容
-
特殊的赋值:
- 双引号(" "):起界定字符串,可以引用解析另一个变量(以变量的值进行赋值);赋值内容有空格时,必须括起来。
- 单引号(' '):可以输出赋值内容包含的特殊符号,引号内容原样输出。
- 反撇号( ` ` ):用于命令替换,引用的是命令,将此命令的结果赋值给变量。
- $( ) :可实现嵌套命令替换操作。例如:rpm -qc $(rpm -qf $(which useradd))
- read 命令:类似交互模式,然后把交互输入的值给变量赋值;“ -p ”选项可设置提示信息,进行交互。
(4)设置变量的作用范围
-
局部变量(默认):仅在当前 Shell 进程有效。
-
全局变量(环境变量): export (导出)变量名 #把现有变量导出为全局变量 (临时)
export 变量名=“变量值” #直接创建全局变量(临时)
/etc/profile :写入全局变量配置文件 (永久生效)文件内容示例:export PATH="/usr/bin:$PATH" # 设为全局变量(子进程可继承)
(5)数值变量的运算
-
基本格式:expr 变量 1 运算符(+ - \* / % : 加、减、乘、除、求模)变量2 [运算符 变.....]
-
可实现算术运算语法:
# 方式一:双括号 sum=$((10 + 5 * 2)) # 结果为 20 # 方式二:expr(注意空格!) sum=`expr 10 + 5` # 结果为 15(仅整数) # 方式三:let let "sum=10+5" # 结果为 15
2.特殊的 Shell 变量
(1)环境变量
-
定义:全局生效的变量,影响 Shell 行为。
-
常用变量:
-
PATH
:命令搜索路径 -
HOME
:用户主目录 -
USER
:当前用户名
-
-
查看所有环境变量:
env : 查看当前工作环境下的环境变量
-
设置脚本或程序等为默认搜索路径(可直接以文件名运行脚本)
1. 脚本拷贝到系统文件
2. 做软链接(推荐)
3. 写全局变量 PATH="路径:$PATH" 将路径添加到默认搜索环境变量中
(2)只读变量
-
定义后不可修改、不可删除:
readonly pi=3.14 #创建只读变量
pi=3.1415 # 报错:readonly variable,不可重新赋值
unset 变量名 #报错:readonly variable ,不可删除
-
查看只读变量:
readonly # 列出所有只读变量
(3)位置变量
-
脚本参数传递:
-
$0
:脚本名称 -
$1
~$9
:第 1~9 个参数 -
$10
需写成${10}
-
-
获取所有参数:
-
$@:所有参数列表(每个参数独立)
-
示例:
# 执行脚本:./script.sh a b c echo "第一个参数:$1" # 输出 a echo "所有参数:$@" # 输出 a b c
-
(4)预定义变量
系统自动维护的变量:
-
$?: 前一条命令的执行结果,0为正确。其他为错
-
$# : 位置参数的个数
-
$*:位置参数的内容
-
$$
:当前 Shell 进程的 PID -
$!
:最后一个后台进程的 PID -
示例:
ls /non-exist echo "上条命令是否成功:$?" # 输出非 0 echo "当前进程 PID:$$"
四、总结
核心执行方式 ★★
• bash script.sh
→ 显式调用bash解释器
• ./script.sh
→ 需先赋予执行权限
重定向操作 ★★★
[输入输出流控制]
• >
:覆盖输出重定向(例:ls > file.txt
清空原内容写入)
• >>
:追加输出重定向(日志文件常用)
• <
:输入重定向(例:sort < data.txt)
管道符操作 ★★
• 前命令的输出作为后命令的输入
• 例:ps aux | grep nginx
→ 进程筛选黄金组合
变量总结速查表:
变量类型 | 示例 | 用途 |
---|---|---|
自定义变量 | name="Bob" | 存储临时数据 |
环境变量 | export PATH | 全局配置 |
位置变量 | $1 , $@ | 脚本参数处理 |
预定义变量 | $? , $$ | 获取系统状态信息 |
核心原则:
-
变量引用时加
$
,赋值时不用。 -
作用域控制避免污染全局环境。