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}
- 点赞
- 收藏
- 关注作者
评论(0)