sh 是 AIX 操作系统中的一个核心命令,它本身是 Bourne Shell 的一个实现,Shell 是一个命令行解释器,它充当用户与操作系统内核之间的桥梁,负责读取用户输入的命令、解释这些命令并执行它们。

虽然现代 AIX 系统上更常用 ksh (KornShell) 或 bash (Bourne-Again Shell),但 sh 依然是系统脚本、启动流程和许多标准工具的首选,因为它保证了高度的可移植性和标准兼容性。
sh 命令的基本用法
sh 命令最核心的用途是执行 Shell 脚本文件。
基本语法
sh [选项] [脚本文件名] [参数...]
- 选项: 控制脚本执行行为的标志。
- 脚本文件名: 要执行的包含 shell 命令的文本文件。
- 参数: 传递给脚本的命令行参数,在脚本内部可以通过
$1,$2, ... 等变量访问。
常用选项
| 选项 | 全称 | 描述 |
|---|---|---|
-x |
xtrace |
调试模式,在执行前,打印出所有执行的命令及其参数,这是排查脚本问题的最常用选项。 |
-v |
verbose |
详细模式,在读取时,将脚本内容打印到标准错误输出。 |
-e |
errexit |
错误退出,如果任何命令返回一个非零的退出状态(表示失败),则立即退出脚本。 |
-n |
noexec |
语法检查,只读取脚本并进行语法检查,但不执行其中的命令。 |
-a |
allexport |
导出所有变量,在后续赋值时,自动将变量导出给后续执行的命令。 |
-u |
nounset |
使用未定义变量时报错,如果尝试使用一个未定义的变量,脚本会报错并退出。 |
实践示例
假设我们有一个名为 test.sh 的脚本,内容如下:
test.sh

#!/bin/sh # 这是一个简单的 sh 脚本示例 echo "脚本开始执行..." echo "第一个参数是: $1" echo "第二个参数是: $2" echo "计算 1 + 2..." result=$((1 + 2)) echo "结果是: $result" # 模拟一个错误命令 ls /non_existent_directory echo "如果能看到这行,说明-e选项没有生效"
示例 1: 正常执行脚本
sh test.sh Hello World
输出:
脚本开始执行...
第一个参数是: Hello
第二个参数是: World
计算 1 + 2...
结果是: 3
ls: 0653-341 The file /non_existent_directory does not exist.
如果能看到这行,说明-e选项没有生效
- 脚本执行了所有命令,即使
ls命令失败了,脚本也继续执行。
示例 2: 使用 -x 选项进行调试
sh -x test.sh Hello World
输出:
+ echo '脚本开始执行...'
脚本开始执行...
+ echo '第一个参数是: Hello'
第一个参数是: Hello
+ echo '第二个参数是: World'
第二个参数是: World
+ echo '计算 1 + 2...'
计算 1 + 2...
+ result=3
+ echo '结果是: 3'
结果是: 3
+ ls /non_existent_directory
ls: 0653-341 The file /non_existent_directory does not exist.
+ echo '如果能看到这行,说明-e选项没有生效'
如果能看到这行,说明-e选项没有生效
- 每行前面带有 的内容是
sh实际执行的命令,这对于理解脚本执行流程和定位问题非常有帮助。
示例 3: 使用 -e 选项在错误时退出
sh -e test.sh Hello World
输出:
脚本开始执行...
第一个参数是: Hello
第二个参数是: World
计算 1 + 2...
结果是: 3
ls: 0653-341 The file /non_existent_directory does not exist.
- 脚本在
ls命令失败后立即终止,最后一行echo命令没有被执行。
示例 4: 使用 -n 选项仅检查语法
sh -n test.sh
输出:

# 如果脚本语法正确,则没有任何输出
# 如果语法有误,会报错,test.sh: line 10: syntax error at unexpected token `)'
- 这个命令不会执行脚本,只是快速检查脚本是否有语法错误。
AIX 中 sh 的重要特性
-
脚本文件头 (Shebang) 在脚本的第一行,你通常会看到
#!/bin/sh,这被称为 "Shebang",它告诉操作系统,当这个文件被直接执行时(通过./test.sh),应该使用/bin/sh这个解释器来运行它。#!/bin/sh echo "This script is being run by sh"
注意: 在 AIX 上,
/bin/sh通常指向一个符合 POSIX 标准的 Shell 实现,它可能是ksh的一个兼容模式,或者是一个纯粹的 Bourne Shell,这保证了脚本在不同系统上的一致性。 -
与
ksh的关系 在 AIX 7.2 及更高版本中,/bin/sh通常是一个指向ksh的符号链接,或者是一个与ksh高度兼容的程序,这意味着你可以在sh脚本中使用很多ksh的特性(如关联数组、更复杂的字符串操作等),但为了最大的可移植性,建议坚持使用 POSIX 标准的语法。 -
系统守护进程和启动脚本 许多 AIX 系统的守护进程和启动/停止脚本(通常位于
/etc/init.d/或类似目录)使用sh作为其解释器,因为它们需要在系统启动的早期阶段运行,而此时ksh或bash可能尚未完全加载。
与 ksh 和 bash 的比较
| 特性 | sh (Bourne Shell) |
ksh (Korn Shell) |
bash (Bourne-Again Shell) |
|---|---|---|---|
| 兼容性 | 最高,POSIX 标准,所有 Unix-like 系统都有。 | 良好,兼容 sh,并提供更多高级功能。 |
良好,兼容 sh,但 sh 严格模式下不完全兼容 bashism。 |
| 交互性 | 较弱,功能简单。 | 优秀,命令行编辑、历史记录、作业控制等。 | 优秀,类似 ksh,并增加了许多新功能(如 alias -p)。 |
| 编程能力 | 基础。 | 强大,关联数组、函数、更复杂的结构。 | 非常强大,包含了 ksh 的大部分功能,并有自己的扩展。 |
| AIX 默认 | 是系统的标准、默认 Shell。 | AIX 7.2+ 的默认用户 Shell,/bin/sh 通常指向它。 |
需要单独安装,不是系统默认。 |
| 推荐用途 | - 系统管理脚本 - 需要跨平台运行的脚本 - 简单的任务自动化 |
- 日常交互式使用 - 复杂的脚本编程 - AIX 系统管理 |
- Linux 环境下的标准 - 需要高级功能的交互式环境 - 开发环境 |
总结与最佳实践
-
何时使用
sh?- 当你编写的脚本需要在多种 Unix/Linux 系统上运行时,首选
sh。 - 当你在编写 AIX 系统级别的启动或管理脚本时,应该使用
sh。 - 当脚本逻辑简单,不需要复杂的交互式功能时。
- 当你编写的脚本需要在多种 Unix/Linux 系统上运行时,首选
-
如何编写健壮的
sh脚本?-
使用
set命令增强脚本健壮性:在脚本开头使用set命令来启用严格的错误检查。#!/bin/sh # 严格模式:遇到错误则退出,使用未定义变量则报错 set -euo pipefail # 你的脚本代码
set -e: 等同于-e选项。set -u: 等同于-u选项。set -o pipefail: 管道中的任何一个命令失败,整个管道的返回值都将是非零。
-
始终为变量加上引号:防止因文件名中包含空格而导致的错误。
# 错误 echo $filename # 正确 echo "$filename"
-
-
如何从
sh切换到ksh? AIX 7.2 之后,新用户的默认 Shell 已经是ksh,如果你的系统还是sh,或者你想临时使用ksh,只需执行:ksh
这会启动一个新的 Korn Shell 会话,要永久更改用户的默认 Shell,使用
chsh命令:chsh -s /usr/bin/ksh <username>
希望这份详细的指南能帮助你更好地理解和使用 AIX 上的 sh 命令!
