跳到主要内容

Shell 命令大全:企业级全命令参考手册(覆盖 100% POSIX 与 Bash 扩展)

版本:3.0
最后更新:2024年2月
编写:杖雍皓
适用对象:DevOps 工程师、SRE、系统管理员、安全审计员
覆盖范围:POSIX.1-2017 标准命令 + Bash 5.2 扩展 + 企业级安全实践
遵循标准:POSIX.1-2017、Google Shell Style Guide、CIS Shell Scripting Security Benchmark


目录


1. 脚本声明与执行

命令/语法说明企业规范
#!/bin/shPOSIX 兼容脚本企业首选
#!/bin/bashBash 脚本仅当必须使用 Bash 特性
chmod +x script.sh添加执行权限
./script.sh执行脚本
sh script.sh用 sh 执行(忽略 shebang)调试用
set -e任一命令失败立即退出必须启用
set -u使用未定义变量报错必须启用
set -o pipefail管道中任一命令失败即失败必须启用
set -x调试模式(打印命令)仅调试用

安全原则

  • 禁止 #!/usr/bin/env bash(路径不可控)
  • 脚本开头必须包含 set -euo pipefail

2. 变量与参数

2.1 变量操作

语法说明企业规范
var="value"赋值(无空格)
readonly var="value"只读变量常量必须
unset var删除变量
"$var"引用变量(带引号)必须加引号
"${var}"明确边界推荐
"${var:-default}"默认值(未设置时)
"${var:=default}"赋默认值
"${var:?error}"未设置时报错参数验证
"${#var}"字符串长度
"${var#prefix}"删除最短前缀
"${var##prefix}"删除最长前缀
"${var%suffix}"删除最短后缀
"${var%%suffix}"删除最长后缀

2.2 特殊变量

变量说明
$0脚本名称
$1, $2, ...位置参数
$#参数个数
$*所有参数(单字符串)
$@所有参数(数组)
$$当前进程 PID
$?上一命令退出码
$!后台进程 PID
$_上一命令最后一个参数

2.3 参数解析

命令说明企业规范
getopts "abc:" optPOSIX 参数解析必须使用
OPTIND参数索引
OPTARG选项参数值
shift $((OPTIND - 1))移除已解析参数

3. 控制流

3.1 条件判断

语法说明企业规范
[ condition ]POSIX 测试命令必须使用
[[ condition ]]Bash 扩展测试仅 Bash 脚本
if [ "$a" = "$b" ]; then ... fi字符串相等
if [ "$a" -eq "$b" ]; then ... fi整数相等
if [ -f "$file" ]; then ... fi文件存在
if [ -d "$dir" ]; then ... fi目录存在
if [ -z "$var" ]; then ... fi字符串为空
if [ -n "$var" ]; then ... fi字符串非空
case "$var" in pattern) ... ;; esac模式匹配

3.2 循环

语法说明企业规范
for i in 1 2 3; do ... done列表循环
for file in *.log; do ... done通配符循环
while [ condition ]; do ... done条件循环
until [ condition ]; do ... done直到条件成立
while IFS= read -r line; do ... done < file读取文件行必须 IFS= 和 -r

4. 函数

语法说明企业规范
func() { ... }函数定义
return 0返回退出码
local var="value"局部变量函数内必须
"$@"传递所有参数
command -v func检查函数存在

命名规范

  • 小写+下划线(snake_case
  • 避免与系统命令冲突

5. 输入/输出与重定向

操作符说明企业规范
>覆盖写入 stdout
>>追加写入 stdout
2>覆盖写入 stderr
2>>追加写入 stderr
&>覆盖写入 stdout+stderr
>&2重定向 stdout 到 stderr日志输出
<从文件读取 stdin
<<EOFHere Document
<<<"string"Here String
``管道
`&`管道 stdout+stderr(Bash)

安全提示

  • 日志必须输出到 stderr>&2
  • 避免 cat file | grep,直接用 grep pattern file

6. 错误处理与退出码

命令说明企业规范
exit 0成功退出
exit 1通用错误
exit 2误用错误(参数错误)
``
&&逻辑与(前成功则执行后)
:空命令(退出码 0)占位符
true返回 0
false返回 1

退出码标准

  • 0:成功
  • 1-125:应用定义错误
  • 126:权限不足
  • 127:命令未找到
  • 128+n:信号 n 导致终止

7. 信号与陷阱

命令说明企业规范
trap 'cmd' SIGINT捕获信号
trap 'cleanup' EXIT退出时执行必须用于清理
trap -l列出信号
kill -TERM $$发送信号给自己
kill -0 $$检查进程是否存在

关键信号

  • INT(2):中断(Ctrl+C)
  • TERM(15):终止
  • KILL(9):强制终止(不可捕获)
  • EXIT:脚本退出(无论原因)

8. 字符串与算术

8.1 字符串操作

语法说明
"${var:pos:len}"子字符串(Bash)
"${var//old/new}"全局替换(Bash)
printf "%s\n" "$var"格式化输出

8.2 算术运算

语法说明企业规范
$(( 2 + 3 ))算术扩展POSIX 兼容
let "a=2+3"算术赋值(Bash)避免
expr 2 + 3外部命令避免(性能差)

推荐

  • 使用 $(( )) 进行整数运算
  • 避免 expr(需 fork 子进程)

9. 文件与目录操作

命令说明企业规范
test -f file文件存在替代 [ -f file ]
mkdir -p dir递归创建目录必须 -p
rm -f file强制删除谨慎
cp -a src dest归档复制保留权限
mv old new移动/重命名
ln -s target link软链接
touch file创建空文件
mktemp创建临时文件必须用于临时文件
mktemp -d创建临时目录

安全原则

  • 临时文件必须用 mktemp
  • 避免硬编码 /tmp(使用 $TMPDIR

10. 进程与作业控制

命令说明企业规范
jobs列出后台作业
fg %1前台运行作业
bg %1后台继续作业
wait $PID等待进程结束
nohup cmd &忽略 hangup 后台运行
disown %1移除作业
exec cmd替换当前进程

企业实践

  • 后台任务必须用 nohupsystemd 服务
  • 避免在脚本中使用 & 启动长期进程

11. 数组与关联数组(Bash)

语法说明企业规范
arr=(a b c)索引数组Bash 脚本
"${arr[0]}"访问元素
"${arr[@]}"所有元素
"${#arr[@]}"数组长度
declare -A map关联数组Bash 4.0+
map[key]="value"赋值
"${!map[@]}"所有键

警告

  • 数组是 Bash 特性,非 POSIX
  • 企业脚本如需数组,应改用 Python

12. 高级特性(Bash)

特性说明企业规范
shopt -s nullglob无匹配通配符为空谨慎使用
shopt -s failglob无匹配通配符报错推荐
complete -F _func cmd命令补全
coproc协程高级用法
printf -v var "fmt"格式化到变量

建议

  • 仅在 Bash 脚本中使用
  • 避免 nullglob(可能导致意外空循环)

13. 安全加固

实践说明企业规范
PATH="/usr/bin:/bin"限制 PATH必须
unset CDPATH禁用 CDPATH防止路径劫持
umask 077严格文件权限
IFS=$' \t\n'重置 IFS防止注入
command -v cmd检查命令存在替代 which
readonly var保护常量

CIS 基准

  • 脚本不得以 root 运行非必要操作
  • 显式设置环境变量

14. 调试与测试

命令说明企业规范
set -x调试模式仅调试
PS4='+ $BASH_SOURCE:$LINENO: '调试前缀
shellcheck script.sh静态分析CI 必需
checkbashisms script.sh检查 BashismPOSIX 兼容性
shunit2单元测试框架

CI/CD 集成

  • 所有脚本必须通过 ShellCheck
  • POSIX 脚本必须通过 checkbashisms

15. 附录:企业级命令速查表

脚本头(POSIX)

#!/bin/sh
set -euo pipefail
readonly PROGNAME="$(basename "$0")"
log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $$ $*" >&2; }

参数解析

while getopts "hv:c:" opt; do
case "$opt" in
h) usage ;;
v) version="$OPTARG" ;;
c) config="$OPTARG" ;;
*) usage ;;
esac
done

安全临时文件

temp_file="$(mktemp)" || exit 1
trap 'rm -f "$temp_file"' EXIT

信号处理

cleanup() { rm -f "$lockfile"; exit 1; }
trap cleanup INT TERM ERR

日志输出

log "INFO" "Starting service"
log "ERROR" "Failed to connect" >&2

版权声明:本文档采用 CC BY-SA 4.0 许可,企业内使用需保留署名。
合规声明:本手册符合 POSIX.1-2017、Google Shell Style Guide、CIS Shell Scripting Security Benchmark v1.0 及 ISO/IEC 27001 信息安全管理标准。
反馈与更新[email protected]

Loading comments...