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

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

该命令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 9bash,但在较低bash版本或sh.

相关内容