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 |
引号
- 单引号
'':原样输出,不解析变量、不转义 - 双引号
"":解析变量,保留空格 - 反引号
`/$():执行命令,结果赋值
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 $? # 查看状态码