Lazy loaded image
运维
Bash & Shell 脚本编程
字数 2174阅读时长 6 分钟
2026-2-23
2026-2-23
author
type
Post
status
Published
date
slug
summary
tags
Linux
category
运维
icon
password

概述:什么是 Shell?Bash 又是什么?

  • Shell 是用户与操作系统内核之间的命令解释器。
  • 常见 shell:
    • shBourne Shell,最原始)
    • bashBourne-Again Shell,Linux 默认)
    • zsh(功能更强,macOS 新版本默认)
    • dash(轻量级,Debian 启动用)
本文以 Bash 为主,语法兼容 sh 的大部分内容。

脚本基本结构

✅ 标准格式

💡 小贴士:
  • 文件扩展名可为 .sh(推荐但不是必须)
  • 赋予执行权限:chmod +x hello.sh
  • 运行脚本:./hello.sh

执行 Shell 脚本的 3 种方式

方式
命令
特点
直接执行
./script.sh
需要 +x 权限,启动子 shell
使用 bash 命令
bash script.sh
不需要权限,总是新建进程
源码加载(source)
source script.sh. script.sh
在当前 shell 中执行,变量保留
推荐使用 bash script.sh 进行开发测试。

变量与参数

定义变量

📌 规则:
  • 无空格在 = 两边
  • 变量名只能包含字母、数字、下划线 _,不能以数字开头
  • 默认所有变量是字符串类型

引用变量

只读变量

删除变量


输入输出处理(read / echo / printf)

echo —— 输出文本

printf —— 格式化输出(更强大)

read —— 从键盘读取输入

read 高级用法


条件判断(if、test、[ ]、[[ ]])

基本 if 结构

注意:中括号 [ ] 是一个命令(即 test 命令),左右必须有空格!

示例:比较数值

操作符(整数)
含义
-eq
等于
-ne
不等于
-lt
小于
-le
小于等于
-gt
大于
-ge
大于等于

字符串比较

操作符(字符串)
含义
===
是否相等
!=
是否不等
-z str
字符串为空?
-n str
字符串非空?
💡 推荐使用双引号包裹变量防止出错:[ "$var" = "value" ]

使用 [[ ]](Bash 扩展,功能更强)

支持通配符匹配 *, <, > 比较字符串大小写等。

字符串操作

获取长度

截取子串

替换字符串

提取路径部分(常用于脚本)


数学运算

方法一:$(( )) 整数运算

方法二:expr 命令(旧方式,少用)

⚠️ 注意:* 必须转义:\\*

浮点数计算?用 bc

安装:sudo apt install bcyum install bc

循环结构(for / while / until)

for 循环

标准 for

类 C 风格(需双括号)

遍历数组

while 循环

读取文件每行

until 循环(当条件为假时继续)


函数定义与使用

定义函数

提示:
  • local 创建局部变量,避免污染全局
  • $1, $2... 是传入的参数

调用函数

返回值说明

  • return N:返回状态码(0~255),用于判断成功失败
  • 若需返回数据,应使用 echo 输出并捕获:

位置参数与特殊变量

变量
含义
$0
脚本名称(含路径)
$1 ~ $9
第1~第9个参数
${10}
第10个及以上参数(必须加 {})
$#
参数总个数
$@
所有参数列表(每个作为独立字符串)
$*
所有参数作为一个字符串
$$
当前脚本进程 ID(PID)
$?
上一条命令的退出状态(0 表示成功)
$!
最近一个后台进程的 PID
$PPID
父进程 ID
✅ 推荐遍历所有参数的方法:

重定向与管道

重定向

操作
说明
>
覆盖输出到文件
>>
追加输出到文件
<
从文件读取输入
2>
错误输出重定向
&>
同时重定向 stdout 和 stderr
示例:

管道 |

将前一个命令输出作为下一个命令输入。

退出状态与错误处理

查看上条命令状态

主动设置退出码

错误中断:set -e

组合开关(推荐开发中使用)


脚本调试技巧

方法一:打印模式 x

或在脚本内部启用:

方法二:启用严格模式(前面已提)

方法三:使用 trap 捕获信号

可用于资源释放,如删除临时文件、关闭连接等。

最佳实践与安全建议

推荐做法
  • 添加 shebang 和注释
  • 使用 set -euo pipefail 开启严格模式
  • 变量尽量用双引号包围:"$var"
  • 使用 local 定义函数内的变量
  • 给脚本合理命名并分类存放(如 /usr/local/bin/
  • 使用 readonly 保护常量
  • 对外部输入进行验证
  • 记录日志而非仅打印屏幕
🚫 避免行为
  • 在 root 下随意运行未经审查的脚本
  • 硬编码敏感信息(密码、密钥)
  • 使用 rm -rf $var/ 而不做检查(可能变 rm -rf /
  • 忽略错误状态
  • 不给变量加引号导致词分裂(Word Splitting)

附录A:常用内置命令速查

命令
说明
cd
切换目录
pwd
显示当前路径
export
导出环境变量
source.
在当前 shell 加载脚本
readonly
设置只读变量
unset
删除变量
alias
创建别名
jobs
查看后台任务
exit N
退出脚本并返回状态 N
sleep N
暂停 N 秒

附录B:文件测试条件表

可在 [ ] 判断中使用:
表达式
含义
[ -f file ]
是否为普通文件
[ -d dir ]
是否为目录
[ -r file ]
是否可读
[ -w file ]
是否可写
[ -x file ]
是否可执行
[ -s file ]
文件大小非零?
[ -e file ]
文件是否存在(任何类型)
[ file1 -nt file2 ]
file1 比 file2 更新(修改时间)
[ file1 -ot file2 ]
file1 比 file2 更旧
例:
上一篇
DHCP 服务配置
下一篇
Linux systemd 服务管理