📖 Bash 脚本编程速查

按使用场景分组,点击"复制"按钮一键复制命令

变量与字符串
定义变量(等号两侧无空格)
name="tom"
引用变量(推荐带花括号与引号)
echo "${name}"
命令输出赋值
files=$(ls /tmp)
字符串拼接
full="${dir}/${file}"
取字符串长度
${#name}
截取子串(从 0 起取 4 位)
${name:0:4}
删除前缀 / 后缀
${var#*/} / ${var%.log}
默认值(变量为空时兜底)
${var:-"default"}
条件判断
字符串相等 / 不等
[ "$a" = "$b" ] / [ "$a" != "$b" ]
数值比较
[ "$n" -eq 10 ](-ne -gt -lt -ge -le)
文件存在 / 是目录 / 可读
[ -f <file> ] / [ -d <dir> ] / [ -r <file> ]
字符串为空 / 非空
[ -z "$var" ] / [ -n "$var" ]
与 / 或组合条件
[ cond1 ] && [ cond2 ] / [[ cond1 || cond2 ]]
if 完整结构
if [ -f a.txt ]; then echo yes; else echo no; fi
正则匹配(双方括号)
[[ "$line" =~ ^ERROR ]]
循环与数组
遍历列表
for f in *.log; do echo "$f"; done
C 风格计数循环
for ((i=0; i<10; i++)); do echo $i; done
逐行读文件
while IFS= read -r line; do echo "$line"; done < app.log
无限循环(含退出条件)
while true; do sleep 5; done
定义数组与取值
arr=(a b c);echo "${arr[0]}"
数组长度与遍历全部元素
${#arr[@]};for x in "${arr[@]}"; do echo "$x"; done
跳出 / 跳过本轮
break / continue
函数与参数处理
定义函数
deploy() { echo "$1"; }
函数参数($1 $2,全部参数)
"$1" / "$@"
函数返回字符串(echo + 命令替换)
result=$(myfunc)
脚本参数个数与脚本名
$# / $0
循环处理全部入参
for arg in "$@"; do echo "$arg"; done
解析选项参数(getopts)
while getopts "u:p:h" opt; do case $opt in u) user=$OPTARG;; esac; done
要求必填参数否则退出
: "${1:?缺少参数:环境名}"
重定向与管道
输出覆盖 / 追加到文件
echo hi > out.txt / echo hi >> out.txt
丢弃全部输出
./run.sh > /dev/null 2>&1
错误输出重定向到文件
./run.sh 2> err.log
标准输出与错误分别记录
./run.sh > out.log 2> err.log
管道串联并统计行数
grep ERROR app.log | wc -l
管道结果逐条处理
ps aux | grep java | awk '{print $2}'
here-doc 多行写入
cat <<EOF > conf.txt
脚本健壮性
严格模式三件套(出错即停 / 未定义变量报错 / 管道任一失败即失败)
set -euo pipefail
打印每条执行的命令(调试)
set -x
获取上一条命令退出码
$?
命令失败时兜底执行
make build || echo "构建失败"
捕获退出信号做清理
trap "rm -f /tmp/lock" EXIT
后台运行并等待全部结束
job1 & job2 & wait