开发工具

Shell 大括号{}

13 篇文章69 次收藏

在 Shell 中,大括号 {} 是一个功能极其强大的符号,用途广泛且灵活。以下是关于 {} 的 8 大核心用法,配合实用示例和注意事项:

一、字符串组合扩展

功能:快速生成多个字符串组合

echo {apple,banana,cherry}-fruit
# 输出:apple-fruit banana-fruit cherry-fruit

cp /path/to/file{,.bak}  # 给文件创建备份
# 等价于:cp /path/to/file /path/to/file.bak

注意:

大括号内不能有空格(除非用引号包裹)

支持嵌套:{a{b,c},d} → ab ac d


二、数字/字母序列生成

功能:生成连续序列,支持步长

echo {1..5}       # 1 2 3 4 5
echo {a..e}       # a b c d e
echo {5..1..-2}   # 5 3 1(反向步长)
echo {001..003}   # 001 002 003(自动补零)

典型用途:

# 批量创建目录
mkdir -p project/{src,test}/{js,css} 

# 生成日期序列
echo 2023-{01..12}-01


三、代码块分组(当前 Shell 环境)

功能:将多条命令组合成块,在当前 Shell 执行(与子 Shell 的 () 对比)

{
  echo "Start: $(date)"
  ls -l
  echo "End: $(date)"
} > log.txt  # 所有输出重定向到文件

关键规则:

{ 后必须有空格或换行

} 前必须有分号或换行

块内变量修改会影响当前 Shell


四、文件名模式匹配

功能:精确控制通配范围

ls *.{jpg,png}    # 只列出 jpg 和 png 文件
rm ./{old,test}*  # 删除以 old 或 test 开头的文件


五、参数扩展(变量操作)

功能:对变量进行截取、替换等操作

file="backup.tar.gz"
echo ${file%.*}    # 删除最短尾部匹配 → backup.tar
echo ${file%%.*}   # 删除最长尾部匹配 → backup
echo ${file#*.}    # 删除最短头部匹配 → tar.gz
echo ${file##*.}   # 删除最长头部匹配 → gz


六、配合重定向

功能:对代码块整体重定向

# 将多行内容写入文件
{
  echo "First line"
  echo "Second line"
} > multi_line.txt

# 同时重定向 stdout 和 stderr
{
  cmd1
  cmd2
} > output.log 2>&1


七、特殊格式扩展

功能:生成复杂组合

# 嵌套扩展
echo {A,B{1,2},C}  # A B1 B2 C

# 数字+字母混合
echo {1..2}{a..b}  # 1a 1b 2a 2b


八、避免通配符意外

功能:明确限定匹配范围

touch a.txt b.txt c.log
echo *.txt        # 风险:可能匹配太多文件
echo {a,b}.txt    # 安全:明确指定文件


重要注意事项

1、空格敏感:

{ echo "Valid"; }  # 正确
{  echo "Invalid"}   # 错误(缺少空格/分号)


2、与 () 的关键区别

特性{}()
执行环境当前 Shell子 Shell
变量影响修改会影响当前环境隔离环境,不影响父 Shell
语法要求需分号/空格可直接使用


3、不支持的操作

# 变量扩展无效
vars="a,b,c"
echo {$vars}   # 输出 {a,b,c}(不会展开)


终极实用案例

# 批量重命名文件(添加前缀)
for file in *.txt; do 
  mv "$file" "backup_${file}"
done

# 使用大括号简化:
for file in *.txt; do 
  mv "$file"{,.bak}  # 等价于 mv "$file" "$file.bak"
done

# 快速创建项目结构
mkdir -p project/{src/{main,test}/{java,resources},config,logs}

通过掌握大括号的这 8 种用法,你的 Shell 脚本效率将提升 300%!尤其适合批量文件操作、日志记录和复杂目录构建场景。