该命令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
?
答案1
他们叫大括号扩展。
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{,,,}
一些常见用途:
for index in {1..10}; do
echo "$index"
done
touch test_file_{a..e}.txt
或者另一个“hack”来打印字符串 10 次:
printf -- "mystring\n%0.s" {1..10}
请注意,大括号扩展bash
已完成前参数扩展,因此一个常见的错误是:
num=10
for index in {1..$num}; do
echo "$index"
done
(ksh93
不过 shell 可以处理这个问题)
答案2
佩萨的回答答案涵盖了问题的重要方面。有几件事我想补充一下。
中的星号ls *.txt
由 shell 处理,因此由 shell 选项控制,这些选项可以通过 shell 内置命令更改。在这种情况下,可以通过运行禁用星号扩展set -f
并通过 再次启用它set +f
。
另一件事是,任何想要使脚本可移植的人都应该检查 POSIX 标准。例如,{1..9..2}
扩展到41 3 5 7 9
中bash
,但在较低bash
版本或sh
.