支撑扩展
在 Bash shell执行终端窗口中的命令或脚本中的一行之前,它会检查是否需要对命令执行任何替换。变量名由它们的值代替,别名由它们的简写命令代替,并且执行任何扩展。Brace 扩展是 Bash 支持的一种扩展形式。
支撑扩展在现代 shell 中可用,但在一些旧 shell 中可能会丢失。如果要在脚本中使用大括号扩展,请确保调用支持大括号扩展的 shell,例如 Bash:
#!/bin/bash
我们将在示例中使用 Bash。
生成字符串列表可能看起来更新颖而不是好处,但它确实提供了一些可以节省时间和击键的功能。通常,它可以为问题或需求提供简单而优雅的解决方案。
简单的扩展
大括号扩展包含在一对大括号“{}”之间。它可以是逗号分隔项的列表或范围说明符。除非您将字符串括在引号“ "
.”中,否则大括号内不允许有空格。
对于逗号分隔的列表,扩展过程依次获取每个元素并将其传递给调用命令。在这个例子中,它echo
只是在终端窗口中简单地打印它们。请注意,逗号将被忽略。
回声{一,二,三,四}
列表可以是单词或数字。
回声{1,2,3,4}
列表元素的顺序是完全任意的。
回声 (4,2,3,1)
扩展范围有一个开始和一个结束字符,用两个句点“ ..
”连接,没有任何空格。所有缺失的列表元素都由扩展自动提供,以便创建从开始字符到结束字符的整个范围。
这将打印从 1 到 10 的数字。
回声{1..10}
编号是任意的。它不必从一个开始。
回声{3..12}
可以指定范围以便它们向后运行。这将生成一个从 5 到 1 的列表。
回声{5..1}
范围可以包括负数。
回声{4..-4}
正如我们之前指出的,一个范围有一个开始和一个结束字符。它不必是一个数字。它可以是一封信。
回声 {q..v}
字母也可以倒退。
回声{f..a}
对循环使用支撑扩展
您可以在脚本的循环中对范围使用大括号扩展。
对于我在 {3..7}
做
回声 $i
完毕
大括号扩展范围允许您使用字符作为循环变量。
因为我在 {m..q}
做
回声 $i
完毕
循环通常用于脚本中,但没有什么可以阻止您将它们输入到命令行中以查看会发生什么。
对于 {3..7} 中的 i;做回声 $i; 完毕
对于 i 在 {m..q}; 做回声 $i; 完毕
连接和嵌套
两个相邻的扩展不会一个接一个地独立运行。它们互操作。第一个扩展中的每个元素都被第二个扩展中的每个元素作用。
回声{q..v}{1..3}
扩展也可以嵌套。嵌套扩展将作用于它之前的元素。
回声 {part-1,part-2{a,b,c,d},part-3}
您还可以通过创建以逗号分隔的范围扩展列表来嵌套扩展。
回声 {{5..0},{1..5}}
序言和后记
您可以在大括号扩展前后放置文本,以使该文本包含在扩展结果中。放在扩展前面的文本称为序言,而放在大括号扩展后面的文本称为后记。
此命令使用前导码。
回声章节{1..3}
这个例子使用了一个附言:
echo {contents,paper,bilbiography}.md
此命令同时使用两者。
回声章节-{1..4}.md
扩展文件名和目录
您现在可能已经猜到了,大括号扩展的主要用途之一是创建可以传递给其他命令的文件和目录名称。我们一直在使用echo
这种方便的方式来准确查看触发扩展时会发生什么。您可以替换任何以文件名或目录名作为输入的命令,并使用大括号扩展。
要快速创建一些文件,请使用touch
:
触摸文件-{1..4}.txt
ls *.txt
如果您有许多基本名称相同但文件扩展名不同的文件,并且您想对其中的一个子集执行操作,则大括号扩展会有所帮助。在这里,我们将一部分以“program”作为基本名称的文件压缩到一个名为“source-code.zip”的 ZIP 文件中。
开发目录包含许多与主程序具有相同基名的文件。通常,您不想备份或分发诸如“.o”目标文件之类的文件。这是一种仅包含感兴趣的文件类型的巧妙方法。
zip 源代码程序{.c,.h,.css}
此命令将制作一个文件的副本并在其后附加“.bak”,从而制作原始文件的备份副本。需要注意的一个有趣点是大括号扩展包含一个逗号分隔的列表,但第一个元素是空的。如果我们没有包含逗号,就不会发生扩展。
cp 大括号/new/prog-1.c{,.bak}
ls 大括号/新/prog-1.c.bak
要对不同目录中的两个文件执行某些操作,我们可以在文件路径中使用大括号扩展。
在这个例子中,“brace”目录包含两个子目录,一个叫做“new”,一个叫做“old”。它们包含同一组源代码文件的不同版本。我们将使用该diff
程序来查看“prog-1.c”的两个版本之间的差异。
差异大括号/{new,old}/prog-1.c
如果您有需要在项目开始时创建的标准目录框架,您可以使用大括号扩展快速创建它们。该 mkdir
-p
(父)选项创建任何缺失的父目录中创建一个子目录时。
mkdir -p {source,build,man,help{/pages,/yelp,/images}}
树
您可以使用大括号扩展 wget
来下载多个文件。
在此命令中,我们将从名为“test1”和“test2”的两个目录下载文件。每个目录包含两个名为“picture1”和“picture2”的文件。
wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg
列出文件会显示检索到的文件以及如何wget
重命名文件以避免与现有文件发生名称冲突。
ls图片*.*
拥抱大括号
大括号扩展似乎是Linux 保存得最好的另一个秘密。许多人告诉我他们从未听说过大括号扩展,而其他人告诉我这是他们最喜欢的命令行技巧之一。
试一试,它可能会进入你的命令行技巧集。