主题
11 · 第一个 Bash 脚本:shebang 与严格模式
目标:写出可执行的
.sh,理解 shebang、引号与set -euo pipefail。
前置:建议读完 03 · 权限;服务部署见 10 · 迷你 API。
1. 环境前提
- 云 Ubuntu 或 WSL 均可练本篇(语法相同)
- 脚本统一目录:
~/lab/scripts/ - 解释器:Bash(Ubuntu 默认
/bin/bash)
bash
mkdir -p ~/lab/scripts ~/lab/logs
bash --version1
2
2
2. 最小可执行脚本
bash
cat > ~/lab/scripts/hello.sh <<'EOF'
#!/usr/bin/env bash
# hello.sh — 本系列第一个脚本
echo "hello from $(hostname) at $(date -Is)"
EOF
chmod 755 ~/lab/scripts/hello.sh
~/lab/scripts/hello.sh1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
| 片段 | 含义 |
|---|---|
#!/usr/bin/env bash | shebang:用 PATH 里的 bash 跑(比写死 /bin/bash 更可移植) |
chmod 755 | 所有者可执行(见 03) |
'EOF' | here-doc 不展开变量;正文里的 $() 在运行时才算 |
三种跑法:
bash
~/lab/scripts/hello.sh # 依赖执行位 + shebang
bash ~/lab/scripts/hello.sh # 显式交给 bash(可无 +x)
./hello.sh # 须先 cd 到脚本目录1
2
3
2
3
不要用 sh script.sh 练本系列——Ubuntu 上 sh 常是 dash,许多 bash 写法会挂。
3. 引号:空格与意外展开的防护网
bash
name="Ada Lovelace"
echo $name # 拆成两个词(单词分割)
echo "$name" # 一个词 —— 默认请加双引号
echo 'raw $name' # 单引号:不展开
echo "hi $name" # 双引号:展开变量,保留空格1
2
3
4
5
6
2
3
4
5
6
路径、用户输入、命令替换结果:默认 "$var"。
bash
dir="$HOME/lab/my project" # 故意含空格
mkdir -p "$dir"
ls -la "$dir"1
2
3
2
3
4. 严格模式(本系列默认模板头)
bash
cat > ~/lab/scripts/strict-demo.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
echo "HOME=$HOME"
# 下一行若取消注释:未定义变量会直接退出(因 -u)
# echo "$NOT_DEFINED"
echo "ok"
EOF
chmod 755 ~/lab/scripts/strict-demo.sh
~/lab/scripts/strict-demo.sh1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
| 选项 | 作用 |
|---|---|
-e | 任一命令失败(非 0)则退出 |
-u | 使用未定义变量则退出 |
-o pipefail | 管道中任一失败则整管失败(否则只看最后一命令) |
模板头(后面 12~15 沿用):
bash
#!/usr/bin/env bash
set -euo pipefail1
2
2
注意:set -e 在 if cmd; then 等上下文中行为有细节;不确定时对关键命令显式检查退出码(12 篇细讲)。
5. 调试两招
bash
bash -x ~/lab/scripts/hello.sh # 打印每条执行的命令
# 或在脚本里临时:
# set -x1
2
3
2
3
6. 云机 vs WSL
| 说明 | |
|---|---|
| shebang / chmod | 相同 |
| 行尾 CRLF | 若在 Windows 编辑器保存成 CRLF,可能报 bad interpreter;用 sed -i 's/\r$//' file.sh 或编辑器改 LF |
7. 动手清单
- [ ] 建好
~/lab/scripts/与~/lab/logs/ - [ ]
hello.sh可直接执行并打印主机名 - [ ] 故意写
echo $name(含空格)对比"$name" - [ ]
strict-demo.sh跑通;试着引用未定义变量,确认因-u退出
8. 常见翻车
| 翻车 | 处理 |
|---|---|
Permission denied | chmod +x;或用 bash script.sh |
No such file or directory 指向 shebang | 多半是 CRLF;改 LF |
sh 跑 bash 语法失败 | 改用 bash 或 shebang |
| 忘记引号路径含空格 | 一律 "$path" |
9. 官方入口
- Bash Reference Manual
man bash(搜set、Quoting)help set
下一篇:变量、参数、条件与退出码 —— 让脚本能「接收输入、判断对错」。
