一、Shell 基础认知
1. 什么是 Shell?
Shell 是用户与操作系统内核之间的交互桥梁,它接收用户输入的命令并传递给内核执行。简单来说,Shell 就是一个命令解释器。
2. Shell 的种类
Linux 系统中常见的 Shell 类型包括:
powershell
[root@MissHou ~]# cat /etc/shells
/bin/sh # bash的快捷方式
/bin/bash # 大多数Linux默认Shell,功能全面
/sbin/nologin # 非交互Shell,无法登录
/bin/dash # 轻量型Shell,功能较少
/bin/tcsh # csh的增强版
/bin/csh # C语言风格Shell
二、Shell 脚本基础
1. 什么是 Shell 脚本?
Shell 脚本是将一系列命令按顺序保存到文本文件中,可被解释执行的脚本文件。它无需编译,是解释型的。
组成要素:若干命令 + 脚本基本格式 + 脚本特定语法 + 业务逻辑
2. 脚本应用场景
- 自动化分析处理
- 自动化备份
- 自动化批量部署安装
- 重复化、复杂化工作的自动化执行
3. 脚本基本格式
shell
#!/bin/bash
# Name: 脚本名称
# Desc: 脚本描述
# Path: 存放路径
# Usage: 使用方法
# Update: 更新时间
# 脚本具体命令
commands
...
- 第一行
#!/bin/bash为魔法字节,指定脚本解释器 - 注释以
#开头 - 命令按执行顺序排列
4. 脚本执行方法
(1)标准执行方法(推荐)
shell
# 赋予执行权限
chmod +x 脚本名.sh
# 执行脚本
./脚本名.sh
# 或使用绝对路径
/完整路径/脚本名.sh
(2)非标准执行方法
shell
# 使用bash解释器执行
bash 脚本名.sh
# 使用sh解释器执行
sh 脚本名.sh
# 调试模式执行(查看执行过程)
bash -x 脚本名.sh
# 检查语法错误
bash -n 脚本名.sh
# 读取并执行脚本(不创建子进程)
source 脚本名.sh
. 脚本名.sh
三、Bash 基本特性
1. 命令和文件自动补全
使用Tab键可实现命令、文件名、目录名的自动补全,按两次Tab可显示所有候选。
2. 常用快捷键
| 快捷键 | 功能描述 |
|---|---|
^c | 终止前台运行的程序 |
^z | 将前台程序挂起到后台 |
^d | 退出当前会话(等价于 exit) |
^l | 清屏 |
^a/Home | 光标移到命令行开头 |
^e/End | 光标移到命令行结尾 |
^u | 删除光标前所有字符 |
^k | 删除光标后所有字符 |
^r | 搜索历史命令 |
3. 常用通配符
| 通配符 | 功能描述 |
|---|---|
* | 匹配 0 或多个任意字符 |
? | 匹配任意单个字符 |
[list] | 匹配 list 中的任意单个字符 |
[!list] | 匹配除 list 外的任意单个字符 |
{string1,string2,...} | 匹配多个字符串中的一个 |
示例:
powershell
# 创建多个文件
touch file{1..3}.txt
# 匹配所有txt文件
ls *.txt
# 匹配file后跟一个字符的文件
ls file?.txt
# 匹配file后跟数字1-3的文件
ls file[1-3].txt
4. Bash 中的引号
| 引号类型 | 特点 |
|---|---|
双引号"" | 将内容视为整体,允许通过$引用变量 |
单引号'' | 将内容视为整体,禁止引用变量,特殊符号视为普通字符 |
| 反撇号 `` | 与$()功能相同,优先执行内部命令,不支持嵌套 |
示例:
powershell
[root@server ~]# echo "$(hostname)"
server
[root@server ~]# echo '$(hostname)'
$(hostname)
[root@server ~]# echo `date +%F`
2018-11-22
四、变量定义与使用
1. 变量分类
(1)本地变量
当前用户自定义,仅在当前进程中有效:
powershell
A=hello
(2)环境变量
当前进程有效,且能被子进程调用:
powershell
# 查看环境变量
env
# 查看所有变量(含本地变量)
set
# 将本地变量转为环境变量
export A=hello
# 永久生效(需写入配置文件)
vim /etc/profile 或 ~/.bashrc
export A=hello
(3)系统内置变量
Shell 固定定义的变量,具有特定功能:
| 变量 | 功能描述 |
|---|---|
$? | 上一条命令的退出状态(0 为成功,非 0 为失败) |
$$ | 当前进程的进程号 |
$# | 脚本后面的参数个数 |
$* | 所有参数(作为整体) |
$@ | 所有参数(作为独立个体) |
$0 | 当前执行的程序名 |
$1~$9 | 位置参数变量 |
${10}~${n} | 第 10 个及以后的位置参数 |
2. 变量定义规则
- 变量名 = 变量值(等号两边无空格)
- 获取变量值:
$变量名或${变量名} - 取消变量:
unset 变量名 - 变量名区分大小写
- 变量名由字母、数字、下划线组成,不能以数字开头
- 命令执行结果可保存到变量:
powershell
kernel=`uname -r` name=$(uname -n)
3. 数组
(1)普通数组(整数索引)
powershell
# 定义数组
array=(var1 var2 var3)
array1=(`cat /etc/passwd`) # 从文件读取
# 访问数组元素
echo ${array[0]} # 第一个元素
echo ${array[*]} # 所有元素
echo ${#array[*]} # 元素个数
echo ${!array[@]} # 所有索引
echo ${array[@]:1:2} # 从索引1开始取2个元素
(2)关联数组(字符串索引)
powershell
# 声明关联数组
declare -A asso_array
# 赋值
asso_array[linux]=one
asso_array[java]=two
# 访问
echo ${asso_array[linux]}
echo ${asso_array[*]}
五、算术运算
Shell 默认仅支持整数运算,常用方式:
-
$(( ))powershell
echo $((1+2)) echo $((5-3)) echo $((2*3)) echo $((10/2)) -
$[ ]powershell
echo $[1+2] echo $[5-3] -
expr命令(注意空格和转义)powershell
expr 1 + 2 expr 5 - 3 expr 2 \* 3 # *需要转义 -
let命令powershell
let a=1+2 let b=5-3 let a+=1 # 等价于a=a+1
自增运算:
i++:先使用后自增++i:先自增后使用
六、条件判断
1. 语法格式
test 条件表达式[ 条件表达式 ](注意前后空格)[[ 条件表达式 ]](支持正则匹配=~)
2. 常用判断参数
(1)文件判断
| 参数 | 功能 |
|---|---|
-e | 文件或目录是否存在 |
-f | 是否为普通文件 |
-d | 是否为目录 |
-s | 文件是否非空 |
-r | 当前用户是否可读 |
-w | 当前用户是否可写 |
-x | 当前用户是否可执行 |
(2)整数比较
| 参数 | 功能 |
|---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
(3)字符串判断
| 参数 | 功能 |
|---|---|
-z | 字符串是否为空 |
-n | 字符串是否非空 |
= | 字符串是否相等 |
!= | 字符串是否不等 |
(4)多重条件判断
| 逻辑符 | 功能 | ||
|---|---|---|---|
-a 或 && | 逻辑与(两个条件都成立) | ||
-o 或 ` | ` | 逻辑或(任一条件成立) |
3. 示例
powershell
# 判断文件是否存在
[ -f /etc/passwd ] && echo "文件存在" || echo "文件不存在"
# 判断是否为root用户
[ $(id -u) -eq 0 ] && echo "是管理员" || echo "非管理员"
# 判断字符串是否相等
name="shell"
[ "$name" = "shell" ] && echo "相等" || echo "不等"
七、流程控制语句
1. if 语句
(1)基本格式
powershell
# 单分支
if [ 条件 ]; then
命令1
fi
# 双分支
if [ 条件 ]; then
命令1
else
命令2
fi
# 多分支
if [ 条件1 ]; then
命令1
elif [ 条件2 ]; then
命令2
else
命令3
fi
(2)示例
powershell
# 判断远程主机是否可ping通
read -p "请输入IP地址: " ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip 可达"
else
echo "$ip 不可达"
fi
2. case 语句
适用于多条件匹配场景:
powershell
case $变量 in
模式1)
命令1
;;
模式2)
命令2
;;
*)
默认命令
;;
esac
示例:
powershell
read -p "请选择操作[1-3]: " num
case $num in
1)
echo "执行操作1"
;;
2)
echo "执行操作2"
;;
3)
echo "执行操作3"
;;
*)
echo "输入错误"
;;
esac
八、循环语句
1. for 循环
(1)列表循环
powershell
for 变量 in 列表; do
命令
done
# 示例
for i in {1..5}; do
echo $i
done
(2)类 C 风格循环
powershell
for ((expr1; expr2; expr3)); do
命令
done
# 示例:打印1-5
for ((i=1; i<=5; i++)); do
echo $i
done
2. while 循环
条件为真时执行循环体:
powershell
while [ 条件 ]; do
命令
done
# 示例:打印1-5
i=1
while [ $i -le 5 ]; do
echo $i
let i++
done
3. until 循环
条件为假时执行循环体:
powershell
until [ 条件 ]; do
命令
done
# 示例:打印1-5
i=1
until [ $i -gt 5 ]; do
echo $i
let i++
done
九、函数
1. 函数定义
powershell
# 格式1
函数名() {
命令集合
}
# 格式2
function 函数名() {
命令集合
}
2. 函数调用
powershell
# 定义函数
hello() {
echo "Hello $1"
}
# 调用函数
hello World # 输出:Hello World
3. 函数返回值
- 使用
return返回状态值(0-255) - 未指定
return时,返回最后一条命令的退出状态
十、正则表达式
1. 基本元字符
| 元字符 | 功能描述 |
|---|---|
. | 匹配任意单个字符(除换行符) |
* | 前导字符出现 0 次或多次 |
.* | 匹配任意长度字符 |
^ | 行的开头 |
$ | 行的结尾 |
^$ | 匹配空行 |
[] | 匹配指定字符组内的任一字符 |
[^] | 匹配不在指定字符组内的任一字符 |
2. 扩展元字符(需使用grep -E或egrep)
| 元字符 | 功能描述 | |
|---|---|---|
+ | 前导字符出现 1 次或多次 | |
? | 前导字符出现 0 次或 1 次 | |
| ` | ` | 匹配多个选项中的一个 |
() | 分组匹配 | |
{n} | 前导字符出现 n 次 | |
{n,} | 前导字符至少出现 n 次 | |
{n,m} | 前导字符出现 n 到 m 次 |
3. 示例
powershell
# 匹配IP地址
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
# 匹配邮箱地址
grep -E '^[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[a-zA-Z]+$' file.txt
十一、总结
Shell 脚本是 Linux 系统管理的重要工具,掌握其基础语法(变量、运算、条件判断、循环、函数)和正则表达式,能极大提高工作效率。学习 Shell 脚本的关键在于:
- 熟悉常用 Linux 命令
- 掌握脚本基本格式和语法
- 多实践、多思考,从模仿到创新
通过不断练习,结合实际需求编写脚本,逐步提升 Shell 编程能力。
896

被折叠的 条评论
为什么被折叠?



