制器坊 编程基础

Bash 基础:目录、引号、脚本与退出码

在练习目录执行小脚本,分清输出与退出码。配合操作示例、图解和检查点,完成第一次练习,再逐步排查使用中的问题。

信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。

官方手册:GNU Bash Reference Manual;命令说明可用 man 命令名 或 命令 --help。【有据可查】


1. 为什么要会 Bash?

【社区共识】Linux 服务器(VPS 入门:连接、账号、防火墙与日常维护 VPS)、macOS 终端、WSL、Docker 容器、CI 流水线都离不开它。Agent 执行的大部分命令也是 Bash——看懂它,才能判断 Agent 申请执行的命令是否危险(AI 编程 Agent 怎么选:工具、权限与工作方式的"弹窗依赖判断力")。

图 1

2. 最常用命令

类别 命令 作用
导航 pwd、cd 目录、ls -la 当前位置、切换、列出(含隐藏文件)
文件 cp、mv、mkdir -p、touch、rm 复制、移动、建目录、建文件、删除
查看 cat、less、head -n 20、tail -f log 查看文件、实时看日志
搜索 grep -rn "关键词" .、find . -name "*.py" 搜内容、搜文件名(也可用更快的 rg)
权限 chmod +x run.sh、chown 改权限、改所有者
进程 ps aux、top/htop、kill PID 查看、结束进程
网络 curl -I URL、ping、ss -tlnp 请求、连通性、监听端口
磁盘 df -h、du -sh * 磁盘空间、目录大小
压缩 tar -czf a.tar.gz dir/、tar -xzf a.tar.gz 打包、解包
帮助 man ls、ls --help 查手册

3. 脚本语法速查

#!/usr/bin/env bash
set -euo pipefail          # 出错即停、未定义变量报错、管道中任一失败即失败

name="world"               # 赋值:等号两边不能有空格!
echo "Hello, ${name}"      # 双引号内变量会展开;单引号不会

# 条件
if [[ -f "config.json" ]]; then
  echo "配置存在"
elif [[ -d "config" ]]; then
  echo "是目录"
else
  echo "不存在"
fi

# 循环
for f in *.txt; do
  echo "处理 $f"
done

# 函数
greet() {
  local who="$1"           # $1 是第一个参数
  echo "Hi, $who"
}
greet "Alice"

# 命令替换与退出码
today=$(date +%F)
if grep -q "ERROR" app.log; then echo "有错误"; fi
echo "上一条命令退出码: $?"
符号 含义
> / >> 覆盖写入 / 追加写入文件
2>&1 把错误输出合并到标准输出
| 管道:前一个命令的输出作为后一个的输入
&& / || 前一个成功才执行 / 失败才执行
$VAR / "$VAR" 变量;加双引号防止空格拆分
~ 家目录
* ? 通配符

4. 危险命令识别表(审批 Agent 命令时必看)

命令模式 风险 层级
rm -rf /、rm -rf ~、rm -rf $VAR/(VAR 可能为空) 删除整个系统或家目录 社区共识
chmod -R 777 所有人可读写执行,严重安全隐患 社区共识
curl ... | bash / | sh 直接执行网络脚本(仅对可信官方源使用) 社区共识
> 重要文件 清空文件 社区共识
dd if=... of=/dev/sdX 覆盖整个磁盘 社区共识
git push --force、git reset --hard 覆盖历史、丢弃改动 社区共识
sudo 开头的任何命令 以管理员权限运行 社区共识
读取 ~/.ssh、.env、*credentials* 并上传 凭据泄露 社区共识

5. 读懂报错

报错 含义 处理
command not found 程序没装或不在 PATH 安装它;which 命令 检查
No such file or directory 路径不存在 pwd 确认当前位置;检查拼写与大小写(Linux 区分大小写)
Permission denied 无权限 脚本需 chmod +x;文件属主不对;不要条件反射加 sudo
syntax error near unexpected token 语法错 常见:if 缺 then/fi、Windows 换行符 \r
$'\r': command not found 脚本是 Windows 换行(CRLF) dos2unix script.sh 或在编辑器改为 LF
bad substitution 用 sh 运行了 Bash 语法 用 bash script.sh 运行
unbound variable set -u 下使用了未定义变量 给默认值 ${VAR:-默认}
Address already in use 端口被占用 ss -tlnp 找到占用进程
Killed 常被系统 OOM 杀掉(内存不足) 查看 dmesg,减小内存占用

退出码:0 为成功,非 0 为失败;127 常表示命令未找到,126 表示无法执行(权限),130 表示被 Ctrl+C 中断。【有据可查:Bash 手册 Exit Status】


6. 本篇无法核实/需谨慎的点

  • macOS 默认 shell 为 zsh,部分语法与 Bash 有差异;BSD 与 GNU 版命令参数也不同。
  • 各发行版预装的工具(如 rg、htop)不同。

小白练习:把本文流程逐项走通

练习目标:在练习目录执行小脚本,分清输出与退出码。

上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。

  1. 先确认当前窗口真的是 Bash,例如 Linux 终端、WSL 或 Git Bash;PowerShell 不是 Bash。

    补充说明:需要 Bash 时在自己已有的 Linux、WSL 或 Git Bash 环境中练习。窗口名称、命令语言和实际工作目录需要分别确认。

  2. 运行 pwd 看位置,再新建一个练习目录并 cd 进入;运行 ls 检查范围。

    补充说明:上文较长脚本包含多段语法;config.json、config、app.log 是示例文件名,不存在时分支和搜索结果会变化,不必先照抄整段运行。

  3. 用编辑器保存一个只输出问候的 hello.sh,采用 LF 换行,再用 bash hello.sh 运行。

    补充说明:首次小脚本只写 echo "Hello, Bash!",保存为 UTF-8、LF 的 hello.sh。bash hello.sh 应输出 Hello, Bash!,这种调用无需先给文件增加可执行权限。

  4. 脚本结束后立刻运行 echo $? 查看退出码;运行其他命令后读到的就不是刚才脚本的退出码了。

    补充说明:成功的问候脚本应返回 0。上文在 if grep ...; then ...; fi 后读取的是复合命令状态,不一定是 grep 本身的状态;测试搜索结果要单独运行 grep 后立即读取,并区分未匹配与执行错误。

  5. 用带空格的文件名练习引号,先查看文件,再复制到新的练习文件名;本练习无需删除真实资料。

    补充说明:例如文件名含空格时,读取可用 cat "practice notes.txt"。先在练习目录准备该文件,检查名字,再观察加引号前后的区别。

  6. 查看 Agent 请求的命令时依次识别执行目录、展开后的目标路径、是否覆盖文件和是否上传内容。

    补充说明:危险命令表用于识别动作与审批,不是待执行的练习清单。> 会覆盖目标内容,>> 会追加;是否写入和写入哪里都要看完整命令。

继续浏览制器坊 返回顶部 ↑
教程图解100%
教程图解
灵犀台