Shell脚本全类型括号语法详解及对比手册(零基础版)

1. 文档说明

这是一份纯小白能看懂的 Shell 括号手册。不搞晦涩专业术语,只用大白话讲清楚 Shell 里所有括号:()(())[][[]]{}${}$()

包含:每个括号是干嘛的、什么时候用、新手容易踩的坑、可直接运行的实战案例。看完彻底解决「括号分不清、写脚本报错、凭感觉乱用」的问题。

运行环境:Linux 主流 Bash 环境(企业生产通用)

前置基础:完全零基础,不用提前会任何东西

2. 所有括号 一眼分清总表(小白查表神器)

先看这张表,彻底根治「所有括号长得像、不知道用哪个」的问题。

括号符号 通俗理解 核心能干啥 什么时候用 小白必看坑点
() 小括号 独立小房间 1. 定义数组;2. 单独开一个小环境执行命令 写数组、临时执行命令不想影响外面脚本 房间里改的东西、切换的目录,出了房间全部失效,外面完全不变
$() 美元小括号 抓命令结果工具 执行一条命令,把命令输出的结果抓回来存起来/直接用 需要获取命令结果、赋值给变量、嵌套执行命令 只抓正常输出,不抓报错;也是独立小房间,不影响外部脚本
(()) 双小括号 纯计算器 专门做整数加减乘除、数字大小对比 只要是数字计算、数字判断全用它 只认整数!不认文字、不认小数;写法随便不用严格空格
[] 单中括号 老旧简易判断器 简单判断:文件有没有、文字是否一致 兼容老脚本,新项目基本不用 规矩巨严!括号两边必须空格,少一个空格直接报错
[[]] 双中括号 万能判断器(推荐首选) 判断文字、判断文件、模糊匹配、正则、多条件组合 脚本里所有判断场景优先用它 容错高、写法随意、不容易报错,企业通用首选
{} 普通大括号 批量打包工具 打包一堆命令批量执行、批量创建文件 批量操作、代码块打包、统一输出日志 和上面小房间相反,这里改的东西全局生效
${} 美元大括号 变量精准锁边工具 精准取出变量值、处理文字、设置默认值 只要用变量,推荐全部加花括号 只处理变量,不执行命令,和 $() 完全两码事

3. 逐个白话精讲 + 可直接运行案例

所有代码直接复制终端就能跑,每一句都用大白话解释,零基础无脑看懂。

3.1 小括号 () 【独立小房间】

大白话核心:只要用 (),就是新开一个临时小房间。房间里随便折腾、切换目录、执行命令,出了房间,外面脚本完全不受影响。

用法1:临时执行命令(不影响外部)

# 先看当前在哪
pwd
# 进小房间切换目录执行命令
(cd /home && echo "小房间里的目录:$(pwd)")
# 出来后,外面目录完全没变
echo "脚本实际目录:$(pwd)"

用法2:专门定义数组

# Shell 数组只能用 () 定义
arr=(10 20 30 "小白学Shell")
echo "第一个值:${arr[0]}"
echo "所有值:${arr[@]}"

3.2 $() 【抓取命令结果】

大白话核心$() 的作用就一句话:执行命令,把屏幕输出的内容抓回来存着用

彻底淘汰老旧反引号 ``,可读性更好,支持多层嵌套,企业统一用这个。

用法1:把命令结果存到变量(最常用)

# 执行 pwd 拿到路径,存到 path 变量
path=$(pwd)
# 执行 whoami 拿到用户名,存到 user 变量
user=$(whoami)

echo "当前路径:$path"
echo "当前用户:$user"

用法2:嵌套执行(吊打反引号)

# 先pwd拿路径,再ls列文件,最后统计数量
file_num=$(ls $(pwd) | wc -l)
echo "当前目录一共有:$file_num 个文件"

用法3:直接嵌入输出,不用提前存变量

echo "当前时间:$(date +%H:%M:%S)"
echo "系统版本:$(uname -r)"

小白坑点

  • 只抓命令正常显示的内容,报错信息抓不到

  • 也是小房间模式,里面改东西,外面不生效

3.3 (()) 双小括号 【专属计算器】

大白话核心:只要你要算数字、比数字大小,直接用它,不用纠结。

只支持整数!不支持小数、文字。写法随便,不用小心翼翼加空格。

用法1:做加减乘除、自增

a=10
b=20
# 混合运算直接写,不用加引号、不用空格限制
res=$((a + b * 2))
echo "计算结果:$res"

# 自增简写,超级方便
((a++))
echo "自增后a=$a"

用法2:if 判断数字大小

age=20
if (( age >= 18 ));then
    echo "成年人"
else
    echo "未成年人"
fi

3.4 [] 单中括号 【老旧严格判断器】

大白话核心:老古董写法,能用但是规矩超级多、极易报错。新项目不要用,看懂老脚本即可。

死规矩:括号里面两边必须留空格[ 1 == 1 ] 正确,[1==1] 直接报错。

# 判断文字相等
name="shell"
if [ "$name" = "shell" ];then
    echo "名字匹配"
fi

# 判断文件是否存在
if [ -f ./test.sh ];then
    echo "文件存在"
fi

3.5 [[]] 双中括号 【万能判断(首选)】

大白话核心新手写判断直接无脑用这个

是单中括号的超级升级版,容错高、支持多条件、支持模糊匹配、不用严格空格,几乎不会报错。

用法1:多条件同时判断

score=85
# 大于60 并且 小于90
if [[ $score > 60 && $score < 90 ]];then
    echo "成绩合格"
fi

用法2:模糊匹配文字(超级好用)

str="test123456"
# 判断字符串是不是test开头
if [[ $str =~ ^test ]];then
    echo "是以test开头的"
fi

3.6 {} 普通大括号 【批量打包工具】

大白话核心:和小括号相反,{}在当前房间干活,改的内容全局生效。主要用来打包命令、批量建文件。

用法1:打包一堆命令,统一输出日志

# 把三条命令打包,全部输出到 log.txt
{
    echo "=====脚本日志===="
    pwd
    ls
} > log.txt

用法2:批量创建文件/遍历范围

# 一次性创建 file1-file5 五个文件
touch file{1..5}.txt

# 输出 a-z 所有字母
echo {a..z}

小白坑点:单行写大括号必须带空格和分号,比如 { echo 1; },否则报错。

3.7 ${} 美元大括号 【变量锁边工具】

大白话核心:单纯用来包变量,防止 Shell 认错变量名,还能简单处理文字。

$() 彻底区分:\(() 执行命令,\){} 只操作变量

用法1:解决变量拼接报错(新手必学)

shell="学习"

# 错误!Shell 会把 shelltest 当成一个新空变量
echo "错误写法:$shelltest"

# 正确!用 {} 把变量框起来,边界清晰
echo "正确写法:${shell}脚本学习"

用法2:变量兜底默认值、文字截断

# 变量为空时,显示默认值
val=""
echo "变量默认值:${val:-这里是默认内容}"

# 删掉开头的 www.
url="www.baidu.com"
echo "处理后域名:${url#www.}"

4. 小白高频踩坑总结(句句干货)

  • 算数字、比数字大小 → 只认 (()),别用别的括号瞎试

  • 做判断(文字/文件/多条件) → 无脑用 [[]],抛弃老旧 []

  • 取命令结果 → 统一 $(),坚决不用反引号 ``

  • 写变量、拼接文字 → 全部套 ${},杜绝诡异报错

  • ()$() 都是子进程小房间,里面改东西外面不生效

  • 单中括号 [] 必须带空格,是新手第一大报错来源

5. 极简选型口诀(直接背)

  1. 数字计算用双小 (())

  2. 条件判断用双中 [[]]

  3. 抓命令结果用 $()

  4. 变量处理用 ${}

  5. 批量打包用 {}

  6. 数组定义用 ()

  7. 总结

在真实企业Shell开发、运维脚本编写中,7种括号只用4种,剩余3种基本废弃不用,彻底降低学习和使用成本。

企业必用核心4种$()(())[[]]${}

企业基本废弃3种()(仅数组偶尔用)、[](老旧淘汰)、{}(仅批量建文件偶尔用)

所有企业脚本统一遵循:优先核心4种,杜绝老旧写法,统一编码规范,减少报错

  1. 企业核心括号终极区分表(查表即用)

核心括号 企业唯一定位 能干什么 不能干什么 企业强制规范
$() 命令结果抓取器 执行命令、获取屏幕输出结果、嵌套执行命令 不能做数学计算、不能做条件判断、不能处理变量 替换反引号``,所有命令取值统一用它
(()) 整数计算器 整数加减乘除、自增自减、数字大小对比判断 不能判断文字、不能判断文件、不支持小数 所有数字运算/判断,只准用它
[[]] 万能判断器 字符串、文件、多条件、正则模糊匹配判断 不能做数学运算、不能抓取命令结果 抛弃[],所有if判断优先无脑用它
${} 变量专用工具 变量调用、变量拼接、默认值兜底、字符截断 不执行命令、不运算数字、不做条件判断 所有变量禁止裸写,必须套${}
  1. 老旧括号企业废弃说明

  • [] 单中括号:语法严苛、极易报错,新项目完全禁用,仅看懂老脚本即可

  • () 普通小括号:仅用来定义数组,禁止用于命令执行、判断运算

  • {} 普通大括号:仅偶尔用于批量创建文件,不用于代码块、逻辑编写

posted @ 2026-08-06 08:53  Docker-沫老师  阅读(57)  评论(0)    收藏  举报