sh(Bourne Shell)是Unix和Linux系统中的经典shell,由Stephen Bourne在1977年开发。它是Unix系统的标准命令解释器,也是POSIX标准shell的基础。
sh实际上是bash或dash的符号链接,运行在POSIX兼容模式下。
sh通常是bash(在兼容模式下)或dash(在Debian/Ubuntu系统中)的符号链接。使用ls -l /bin/sh可以查看它指向哪个shell。
| 选项 | 描述 | 示例 |
|---|---|---|
| -c | 从字符串执行命令 | sh -c "echo Hello" |
| -e | 遇到错误立即退出 | sh -e script.sh |
| -x | 显示执行的命令(调试模式) | sh -x script.sh |
| -v | 显示读取的命令(详细模式) | sh -v script.sh |
| -n | 检查语法但不执行 | sh -n script.sh |
| -u | 使用未定义的变量时报错 | sh -u script.sh |
| -a | 将所有变量导出到环境 | sh -a script.sh |
| -- | 选项结束符,后面的参数不作为选项 | sh -- -file |
| --version | 显示版本信息 | sh --version |
检查系统上的sh实现:
1. 启动交互式sh:
2. 执行脚本文件:
3. 调试脚本:
1. 基本变量操作(两者相同):
2. 变量扩展(sh有限制):
3. 特殊变量(两者相同):
${var^^}、${var,,}、${var:start:length}等。为了兼容性,应使用POSIX标准语法。
sh不支持数组(POSIX sh标准不支持数组):
使用位置参数处理"数组":
1. sh中的算术运算(使用expr或$(( )):
2. 浮点运算(使用bc命令):
$(( ))进行整数运算,使用bc进行浮点运算。避免使用bash特有的算术扩展。
1. 基本if语句(两者相同):
2. 测试条件(sh使用[ ],bash还可以用[[ ]]):
3. case语句(两者相同):
1. for循环(sh的for循环有限制):
2. while循环(两者相同):
3. until循环(两者相同):
1. 函数定义和调用(两者相同):
2. 局部变量(sh不支持local关键字):
1. 读取输入(sh的限制):
2. 重定向和管道(两者相同):
1. 简单的文件备份脚本:
2. 系统信息收集脚本:
1. Shebang行:
2. 避免bash特有的特性:
3. 使用set命令增强脚本健壮性:
4. 变量引用:
5. 测试命令的兼容性:
shellcheck检查脚本兼容性#!/bin/bash
1. 使用shellcheck检查脚本:
2. 在不同shell中测试:
3. 使用checkbashisms检查bashism:
#!/bin/sh#!/bin/bash#!/bin/sh(更快)#!/bin/bash(更方便)bash --posix测试:
| 命令 | 描述 | 与sh的关系 |
|---|---|---|
| bash | Bourne Again Shell,sh的增强版 | 完全兼容sh,但有更多特性 |
| dash | Debian Almquist Shell | Ubuntu/Debian的默认sh,轻量快速 |
| ash | Almquist Shell | dash的前身,BusyBox中的shell |
| ksh | Korn Shell | 商业shell,与sh兼容但有扩展 |
| zsh | Z Shell | 功能丰富的shell,不完全兼容sh |
| csh | C Shell | 语法类似C语言,与sh不兼容 |
| shellcheck | Shell脚本静态分析工具 | 用于检查sh/bash脚本问题 |