Skip to content

基础与数据结构

  • 状态:已验证
  • 来源:对话整理
  • 更新时间:2026-03-12

关键结论

  • Bash 基础写法应优先掌握脚本头、严格模式、变量、参数展开、命令替换和字符串处理。
  • 数据结构部分以数组和关联数组为主,关联数组仅 Bash 支持。

详细分析

  • 速查手册的重点不是解释概念,而是让人能快速找到写法,因此基础部分应覆盖最常用语法块。
  • 与普通总结文档相比,速查手册更适合按语法主题组织示例,例如参数、测试表达式、数组和函数。

可执行步骤

  1. 编写脚本前先确认是否使用 Bash。
  2. 从本文件中复制最接近的基础示例。
  3. 优先保留双引号和严格模式写法。
  4. 修改示例中的变量名、路径和命令后再使用。

命令 / 配置 / 代码

基础

高频写法清单:

  • #!/usr/bin/env bash
  • set -euo pipefail
  • name="value"
  • "$1" "$#" "$@"
  • $(command)
  • ${var:-default}

脚本头与严格模式

  • #!/usr/bin/env bash 指定使用 Bash 解释器执行脚本。
  • set -e 任意命令返回非零退出码时立即退出脚本。
  • set -u 使用未定义变量时报错。
  • set -o pipefail 管道中任一命令失败时,整条管道视为失败。
  • set -euo pipefail 常用严格模式组合。
bash
#!/usr/bin/env bash
set -euo pipefail

注释

  • # comment 单行注释。
bash
# 单行注释

变量

  • name="alice" 字符串赋值。
  • age=18 数值或普通变量赋值。
  • readonly root_dir="/tmp/demo" 只读变量。
  • unset name 删除变量。
  • "$name" 安全展开变量,推荐默认使用。
  • "${name}" 显式变量边界。
  • "${name:-default}" 变量未设置或为空时使用默认值,不修改原变量。
  • "${name:=default}" 变量未设置或为空时赋默认值,并修改原变量。
  • "${name:+exists}" 变量已设置时返回替代值。
  • "${name:?error}" 变量为空或未定义时直接报错退出。
bash
name="alice"
age=18
readonly root_dir="/tmp/demo"
unset name
bash
echo "$age"
echo "${age}"
echo "${name:-default}"
echo "${name:=default}"
echo "${name:+exists}"
echo "${name:?name is required}"

命令行参数

  • "$0" 脚本自身名称。
  • "$1", "$2" 第 1、第 2 个位置参数。
  • "$#" 参数个数。
  • "$*" 所有参数,通常不推荐直接遍历。
  • "$@" 所有参数,保留参数边界,遍历参数时推荐使用。
bash
echo "$0"
echo "$1"
echo "$2"
echo "$#"
echo "$*"
echo "$@"
bash
for arg in "$@"; do
  echo "$arg"
done

命令替换与算术

  • "$(command)" 命令替换,获取命令输出。
  • $((1 + 2)) 算术运算。
  • $((count + 1)) 自增等数值表达式。
bash
now="$(date +%F-%H%M%S)"
sum=$((1 + 2))
count=$((count + 1))

字符串处理

  • "${file%.txt}" 从右侧删除最短匹配后缀。
  • "${file%%.txt}" 从右侧删除最长匹配后缀。
  • "${file#demo}" 从左侧删除最短匹配前缀。
  • "${file##demo}" 从左侧删除最长匹配前缀。
  • "${file/txt/md}" 替换首个匹配字符串。
  • "${file//txt/md}" 替换全部匹配字符串。
  • "${#file}" 获取字符串长度。
bash
file="demo.txt"
echo "${file%.txt}"
echo "${file#demo}"
echo "${file/txt/md}"
echo "${#file}"

数据结构

高频写法清单:

  • arr=("a" "b")
  • "${arr[@]}"
  • "${#arr[@]}"
  • declare -A map
  • "${!map[@]}"

数组

  • arr=("a" "b" "c") 创建数组。
  • "${arr[0]}" 访问指定元素。
  • "${arr[@]}" 获取全部元素。
  • "${#arr[@]}" 获取数组长度。
  • arr+=("d") 追加元素。
  • unset 'arr[1]' 删除指定元素。
bash
arr=("a" "b" "c")
echo "${arr[0]}"
echo "${arr[@]}"
echo "${#arr[@]}"
arr+=("d")
unset 'arr[1]'
bash
for item in "${arr[@]}"; do
  echo "$item"
done

关联数组

  • declare -A map 定义关联数组,仅 Bash 支持。
  • map["key"]="value" 按字符串键赋值。
  • "${map["key"]}" 读取指定键的值。
  • "${!map[@]}" 获取全部键。
  • "${map[@]}" 获取全部值。
bash
declare -A map
map["name"]="alice"
map["role"]="admin"

echo "${map["name"]}"
echo "${!map[@]}"
echo "${map[@]}"

风险与注意事项

  • 变量赋值不能写成 a = 1
  • 路径、参数和变量通常都应加双引号。
  • 遍历参数优先使用 "$@",不要随意用未加引号的 $*
  • 关联数组依赖 Bash,不适用于通用 /bin/sh