花括号扩展在 shell 中是如何工作的?

Mat*_*bon 4 command-line shell brace-expansion

该命令echo {1..3}-{1,2}打印1-1 1-2 2-1 2-2 3-1 3-2. 我了解可以使用这些花括号的方式。但它们究竟什么?

sh/的工作是bash解析/扩展它们并将扩展版本交付给执行的程序吗?

如果是这样,它还能做什么其他技巧,是否有规范?

另外,有名字吗?

ls *.txt内部是否以类似方式处理?

有没有办法实现一个论点的 n 次重复?喜欢(不工作,当然,只是一个概念)cat test.pdf{*3}:?cat test.pdf test.pdf test.pdf?

Pes*_*The 6

它们被称为大括号扩展

它是由bash,zsh和完成的几个扩展之一ksh,文件名扩展*.txt是其中的另一个。POSIX 标准未涵盖大括号扩展,因此不可移植。您可以在bash 手册中阅读此内容。

根据@Arrow 的建议:为了cat test.pdf test.pdf test.pdf单独使用大括号扩展,您必须使用这个“hack”:

#cat test.pdf test.pdf
cat test.pdf{,}

#cat test.pdf test.pdf test.pdf
cat test.pdf{,,}

#cat test.pdf test.pdf test.pdf test.pdf
cat test.pdf{,,,}
Run Code Online (Sandbox Code Playgroud)

一些常见用途:

for index in {1..10}; do
   echo "$index"
done

touch test_file_{a..e}.txt
Run Code Online (Sandbox Code Playgroud)

或者另一个“hack”来打印一个字符串 10 次:

printf -- "mystring\n%0.s" {1..10}
Run Code Online (Sandbox Code Playgroud)

请注意,括号扩展bash参数扩展之前完成的,因此一个常见的错误是:

num=10
for index in {1..$num}; do
   echo "$index"
done
Run Code Online (Sandbox Code Playgroud)

ksh93外壳可以解决这个问题)