Bash 大括号扩展教程:大括号内扩展表达式的示例

举报
Tiamo_T 发表于 2022/02/16 21:17:53 2022/02/16
【摘要】 Shell 在分析输入时的操作之一是 Shell 扩展。Bash 提供了不同类型的扩展。在本文中,让我们了解一个重要的扩展——“大括号扩展”。

Shell 在分析输入时的操作之一是 Shell 扩展。Bash 提供了不同类型的扩展。在本文中,让我们了解一个重要的扩展——“大括号扩展”。


大括号扩展

大括号扩展用于生成任意字符串。大括号扩展允许您从单个参数创建多个修改后的命令行参数。指定的字符串用于生成所有可能的组合与可选的周围前导和后记。序言作为前缀添加到大括号中包含的每个字符串,然后将后记附加到每个结果字符串,从左到右扩展。

$ echo last{mce,boot,xorg}.log
lastmce.log lastboot.log lastxorg.log

where last is Preamble and .log is the postscript

上面的 echo 语句避免您分别指定三个日志文件。如果要查看上次启动日志、mce 日志和 xorg 日志的内容,可以使用上面的 echo 语句所示的大括号扩展。

1. 使用大括号展开的备份示例

$ cat bkup.sh
set -x # expand the commands
da=`date +%F`
cp $da.log{,.bak}

$ ./bkup.sh
++ date +%F
+ da=2010-05-28
+ cp 2010-05-28.log 2010-05-28.log.bak

在上面的备份脚本中,它复制了扩展名为 .bak 的当前日期日志文件。大括号中的第一个元素是空的,所以第一个元素只有前导码。

2. 使用大括号展开恢复示例

$ cat restore.sh
set -x # expand the commands
da=`date +%F`
cp $da.log{.bak,}

$ ./restore.sh
++ date +%F
+ da=2010-05-28
+ cp 2010-05-28.log.bak 2010-05-28.log

在还原脚本中,参数中的第一个元素是 .bak,其中第二个元素为空。


3. 不带前言和后记的大括号展开示例

如果没有序言和后记,它只是扩展大括号中给出的元素。

$ cat expand.sh
echo {oct,hex,dec,bin}

$ ./expand.sh
oct hex dec bin

如果没有可选的前导和后记字符串,结果只是给定字符串的空格分隔列表

范围的大括号扩展

大括号扩展也扩展了序列。序列可以是整数或字符。

4. 整数和字符序列示例

$ cat sequence.sh
cat /var/log/messages.{1..3}
echo {a..f}{1..9}.txt

$ ./sequence.sh
May  9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s
May  9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10
May  9 01:23:44 x3 ntpd[2413]: synchronized to
May  9 01:47:48 x3 dhclient: DHCPREQUEST on eth0
May  9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201
..
..
a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt

第一个 cat 命令展开 messages.1、messages.2 和 messages.3 并显示内容。并且在下一个 echo 语句中,字符和整数序列被组合使用。

具有增量值的序列

在 kshell 大括号扩展中,您可以使用增量值来生成序列。

Syntax:
<start>..<end>..<incr>

incr 是数字。您可以使用负整数,但正确的符号是从开始和结束的顺序推导出来的。

5. 在序列中使用增量的例子

$ ksh
$ echo /var/log/messages.{1..7..2}
/var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7
$

使用它,您可以查看隔日日志文件。

Brace 扩展中的陷阱

大括号扩展不扩展bash 变量,因为大括号扩展是 shell 扩展的第一步,变量将在后面扩展。

6. 扩展变量示例

如果您看到以下两个 for 语句的输出,则可以识别上述陷阱。

$ cat var_seq.sh
# Print 1 to 4 using sequences.
for i in {1..4}
do
        echo $i
done
start=1
end=4

# Print 1 to 4 using through variables
echo "Sequences expressed using variables"
for i in {$start..$end}
do
        echo $i
done

$ ./var_seq.sh
1
2
3
4
Sequences expressed using variables
{1..4}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。