Bash 脚本是 Linux/Unix 自动化任务的核心工具,语法围绕变量、流程控制、文件操作展开。

脚本结构

#!/bin/bash
# 注释
 
# 执行方式
chmod +x script.sh
./script.sh

行内连接符

符号作用规则
;顺序分隔前条成败都执行
&&逻辑与前条成功才执行
||逻辑或前条失败才执行
&后台运行不阻塞终端
|管道stdout 接下条命令 stdin
()子 shell新开环境,不影响当前变量
{}聚合命令同一环境批量执行
mkdir test && cd test
rm abc || echo 文件不存在
sleep 10 &
ls | grep txt

变量

name="Bash"          # 定义(等号无空格)
echo $name           # 使用
echo ${name}test     # {} 明确边界
 
# 命令替换
dir=$(pwd)
 
# 字符串拼接
s3="$s1$s2"
 
# 整数运算
c=$((a+b))

特殊变量

变量含义
$0 $1 $2脚本名、第 1/2 个参数
$#参数个数
$@ $*所有参数(分开)/ 所有参数(合并)
$?上条命令退出状态,0 成功
$$ $!当前进程 PID / 最后后台进程 PID

详解见 Bash特殊变量位置参数

引号

  • 单引号 '':原样输出,不解析变量、不转义
  • 双引号 "":解析变量,保留空格
  • 反引号 ` / $():执行命令,结果赋值
echo '$name'   # 输出 $name
echo "$name"   # 输出变量值
now=$(date)

输入输出

echo "Hello"
read -p "输入姓名:" name
printf "姓名:%s\n" "Alice"

条件判断

推荐 [[ ]](Bash 扩展写法),需兼容 POSIX sh 时用 [ ]

if [[ $a -eq $b ]]; then    # 数值相等
  echo "equal"
elif [[ -f $file ]]; then   # 文件存在
  echo "file exists"
else
  echo "other"
fi
操作符含义
-eq -ne -gt -lt数值比较
== != -z -n字符串比较、空/非空
-f -d -x -e文件判断
&& || !逻辑组合

case 分支

case $var in
  match1)
    cmd1; cmd2
    ;;
  match2|match3)   # 或匹配
    cmd
    ;;
  *)               # 默认匹配
    default_cmd
    ;;
esac
  • 同行多条命令用 ; 分隔,分支结尾固定 ;;
  • 匹配模式支持通配符:* 任意字符、? 单字符、[0-9] 数字、--*-- 开头

循环

# for 遍历列表
for i in 1 2 3 a b; do echo $i; done
for i in {1..5}; do echo $i; done
for ((i=1; i<=10; i++)); do echo $i; done
 
# while
while [[ $i -le 5 ]]; do
  echo $i
  ((i++))
done
 
# 循环控制
break       # 跳出整个循环
continue    # 跳过本次

shift 与参数解析

shift 移除第一个位置参数(shift 2 移除前两个),命令行参数解析标配——while + case + shift:

#!/bin/bash
while [[ $#--gt-0-| -gt 0 ]]; do
  case $1 in
    --key) val="$2"; shift 2 ;;
    *) echo "未知参数: $1"; exit 1 ;;
  esac
done

函数

add() {
  echo $(($1 + $2))
}
result=$(add 3 5)

文件操作

touch file.txt      # 创建
mkdir -p dir/sub    # 创建目录
cp -r src dst       # 复制
mv old new          # 移动/重命名
rm -rf dir          # 删除
cat file            # 读取
grep "key" file     # 搜索

重定向

cmd > file     # 覆盖
cmd >> file    # 追加
cmd < file     # 读取
cmd 2>&1       # 合并 stderr 到 stdout

注释

# 单行注释
 
: '
多行注释
'

调试

bash -x script.sh    # 打印每步执行
echo $?              # 查看状态码

参考