大括号扩展是一种生成字符串列表的有用技术,这些字符串可以在脚本、别名和Linux命令行中使用。少打字,节省时间,避免错误。
在Bash shell在终端窗口或脚本中的行中执行命令之前,它检查是否需要对该命令执行任何替换。变量名将被其值替换,别名将被它们的缩写所替换,并执行任何扩展。支撑展开是Bash支持的一种扩展形式。
支架扩展在现代shell中可用,但在一些旧shell中可能会丢失。如果要在脚本中使用大括号扩展,请确保调用支持大括号扩展的shell,例如Bash:
#!/bin/bash
我们将使用Bash作为示例。
生成字符串列表可能看起来更新奇,而不是一种好处,但它确实提供了一些可以节省时间和击键的功能。通常,它可以为问题或需求提供简单而优雅的解决方案。
大括号扩展包含在一对大括号“{}”之间。它可以是逗号分隔的项目列表或范围说明符。大括号内不允许有空格,除非已将字符串用引号“”括起来
Advertisement
对于逗号分隔的列表,展开过程依次获取每个元素并将其传递给调用命令。在本例中,echo只是在终端窗口中打印它们。请注意,逗号被忽略。
echo {one,two,three,four}列表可以是单词或数字。
echo {1,2,3,4}列表元素的顺序是完全任意的。
echo (4,2,3,1)扩展范围的起始字符和结束字符由两个句点连接没有空格。所有缺少的列表元素都由扩展自动提供,以便创建从起始字符到结束字符的整个范围。
这将打印从1到10的数字。
echo {1..10}编号是任意的。它不必从一开始。
echo {3..12}可以指定范围,以便它们向后运行。这将生成一个从5到1的列表。
echo {5..1}范围可以包括负数。
echo {4..-4}如前所述,范围有起始字符和结束字符。不一定是数字。它可以是一封信。
echo {q..v}字母也可以倒转。
echo {f..a}可以在脚本的循环中对范围使用大括号展开。
for i in {3..7} do echo $i doneAdvertisement
大括号扩展范围允许使用字符作为循环变量。
for i in {m..q} do echo $i done循环通常在脚本中使用,但是没有什么可以阻止您在命令行中输入循环以查看将发生什么。
for i in {3..7}; do echo $i; done两个相邻的扩展不能一个接一个地独立工作。它们可以互操作。第一个展开式中的每个元件由第二个展开式中的每个元件作用。
echo {q..v}{1..3}扩展也可以嵌套。嵌套展开将作用于紧靠它前面的元素。
echo {part-1,part-2{a,b,c,d},part-3}也可以通过创建以逗号分隔的范围扩展列表来嵌套扩展。
echo {{5..0},{1..5}}可以在大括号展开前后放置文本,以使该文本包含在展开结果中。放在扩展前面的文本称为序言,而放在大括号扩展后面的文本称为后记。
此命令使用前导码。
echo chapter{1..3}此示例使用postscript:
echo {contents,paper,bilbiography}.md这个命令同时使用这两种方法。
echo chapter-{1..4}.md现在您可能已经猜到了,大括号扩展的主要用途之一是创建可以传递给其他命令的文件名和目录名。我们一直在使用echo作为一种方便的方法来查看扩展触发时到底发生了什么。您可以替换任何以文件名或目录名作为输入的命令,并使用大括号扩展。
要快速创建一些文件,请使用触摸:
touch file-{1..4}.txt ls *.txtAdvertisement
如果有许多文件具有相同的基名称,但文件扩展名不同,并且希望对其中的一个子集执行操作,则大括号扩展可能会有所帮助。在这里,我们将以“program”作为基名的文件的子集压缩到一个名为“source code.ZIP”的ZIP文件中
开发目录包含许多与主程序同名的文件。通常,您不想备份或分发像“.o”对象文件这样的文件。这是一种只包含感兴趣的文件类型的简洁方法。
zip source-code program{.c,.h,.css}此命令将复制一个文件并将“.bak”附加到该文件中,从而生成原始文件的备份副本。值得注意的一点是,大括号扩展包含一个逗号分隔的列表,但是第一个元素是空的。如果没有逗号,扩展就不会发生。
cp brace/new/prog-1.c{,.bak} ls brace/new/prog-1.c.bak要对不同目录中的两个文件执行某些操作,可以在文件路径中使用大括号展开。
在本例中,“brace”目录包含两个子目录,一个称为“new”,另一个称为“old”,它们包含同一组源代码文件的不同版本。我们将使用diff程序来查看“prog-1.c”的两个版本之间的差异
diff brace/{new,old}/prog-1.cAdvertisement
如果在项目开始时需要创建目录的标准框架,可以使用大括号展开快速创建它们。mkdir-p(parent)选项在创建子目录时创建任何缺少的父目录。
mkdir -p {source,build,man,help{/pages,/yelp,/images}} tree可以将brace expansion与wget结合使用来下载多个文件。
在这个命令中,我们将从两个目录下载文件,分别是“test1”和“test2”,每个目录包含两个文件,分别是“picture1”和“picture2”
wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg列出这些文件将向您显示检索到的文件以及wget如何重命名文件以避免与现有文件发生名称冲突。
ls picture*.*RELATED15 Special Characters You Need to Know for Bash
It seems that brace expansion is another one of Linux’s best-kept secrets. Many people tell me that they’ve never heard of brace expansion, while others inform me that it’s one of their favorite command-line tricks.试一试,它可能会进入您的一组命令行go-to技巧中。
... tldr命令通过简短的解释和bashshell命令的实际示例,说明了这一点。您甚至可以找到一些内置命令的简明解释,这些命令不再作为man条目提供,例如cd命令。 ...
... 两者都将显示为“Run命令”,可以选择该命令立即打开bashshell。使用这两种方法的区别在于,它们在/mnt/c/Windows/System32目录中打开。这意味着您可以在Windows10中浏览System32子目录。 ...
如果您使用shopt微调bashshell的行为,您可以控制超过50个设置。我们将向您展示如何按照您喜欢的方式定制您的Linux系统。 shopt内置 shopt内置是bashshell所有版本的一部分,因此不需要安装任何东西。多年来,shopt提供的选项数量...
在Linux中使用bashshell来管理前台和后台进程。您可以使用Bash的作业控制函数和信号,使您能够更灵活地运行命令。我们教你怎么做。 所有关于流程 每当一个程序在Linux或类似Unix的操作系统中执行时,就会启动一个进程。“进...
要在bashshell的命令行中复制和粘贴吗?我们将向您展示多种技巧,无论您喜欢键盘还是鼠标。无论您是在图形桌面上还是在传统的基于文本的TTY上,这些工具都能工作。 通常的键盘快捷键不起作用 复制和粘贴文本是使用计算...
使用别名和bashshell函数创建自己的Linux命令。驯服重复性的任务,截断冗长的进程,并用您经常使用且难以记住的选项配置标准命令。 别名和shell脚本是Linux和类Unix操作系统中的强大技术,允许您将命令行体验磨练为您想要的。...
如果您想在Linux、macOS或其他类似UNIX的系统上掌握bashshell,那么特殊字符(如~、*、|和>)是至关重要的。我们将帮助您解开这些神秘的Linux命令序列,成为象形文字的英雄。 什么是特殊字符(special characters)? bashshell以两...
...速快照。它是whoami、w、free和df的组合。 type pwd pwd命令是bashshell的内置命令。 type elif elif命令是bashshell保留字。 使用多个命令 您可以一次给type多个命令来标识。 type date top ls -t选项 类型将接受的选项都没有名称。所以我们可...
...这两种类型的文件,所以不管使用哪种压缩方法,只要有bashshell,它都应该是可用的。您只需要使用适当的tar命令行选项。 从tar文件中提取文件 假设你下载了两个乐谱文件。其中一个文件称为四弦琴_歌曲.tar.gz另一种叫吉他_歌...
windows10的bashshell终于有了方便的复制和粘贴键盘快捷键,但由于兼容性的原因,它们在默认情况下被禁用。这些快捷方式在2018年10月的更新中可用,该更新最初的代号为Redstone 5。 要启用复制和粘贴键盘快捷键,请右键单击LinuxB...