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. 极简选型口诀(直接背)
-
数字计算用双小
(()) -
条件判断用双中
[[]] -
抓命令结果用
$() -
变量处理用
${} -
批量打包用
{} -
数组定义用
() -
总结
在真实企业Shell开发、运维脚本编写中,7种括号只用4种,剩余3种基本废弃不用,彻底降低学习和使用成本。
✅ 企业必用核心4种:$()、(())、[[]]、${}
❌ 企业基本废弃3种:()(仅数组偶尔用)、[](老旧淘汰)、{}(仅批量建文件偶尔用)
所有企业脚本统一遵循:优先核心4种,杜绝老旧写法,统一编码规范,减少报错。
-
企业核心括号终极区分表(查表即用)
| 核心括号 | 企业唯一定位 | 能干什么 | 不能干什么 | 企业强制规范 |
|---|---|---|---|---|
$() |
命令结果抓取器 | 执行命令、获取屏幕输出结果、嵌套执行命令 | 不能做数学计算、不能做条件判断、不能处理变量 | 替换反引号``,所有命令取值统一用它 |
(()) |
整数计算器 | 整数加减乘除、自增自减、数字大小对比判断 | 不能判断文字、不能判断文件、不支持小数 | 所有数字运算/判断,只准用它 |
[[]] |
万能判断器 | 字符串、文件、多条件、正则模糊匹配判断 | 不能做数学运算、不能抓取命令结果 | 抛弃[],所有if判断优先无脑用它 |
${} |
变量专用工具 | 变量调用、变量拼接、默认值兜底、字符截断 | 不执行命令、不运算数字、不做条件判断 | 所有变量禁止裸写,必须套${} |
-
老旧括号企业废弃说明
-
[]单中括号:语法严苛、极易报错,新项目完全禁用,仅看懂老脚本即可 -
()普通小括号:仅用来定义数组,禁止用于命令执行、判断运算 -
{}普通大括号:仅偶尔用于批量创建文件,不用于代码块、逻辑编写
原文地址: https://www.cveoy.top/t/topic/qHgV 著作权归作者所有。请勿转载和采集!