{1,2,3} 和 {1..3} 之间的差异

{1,2,3} 和 {1..3} 之间的差异

{1,2,3}和之间的序列有区别吗{1..3}

例如,如果我有一些文件

file.1
file.2
file.3

我想将cat它们放在一起使用安全吗cat file.{1..3} > file

我知道这cat file.*>file可能会导致问题,因为 shell 有时会以随机方式扩展文件(我认为这取决于索引节点,是吗?)

答案1

{1..3}{1,2,3}产生相同的结果,但以不同的方式。

一般来说,{n1..n2}(首先来自zshbash后来ksh复制它)其中n1n2are 整数产生n1和之间的所有数字n2。同时{x,y,z}产生三个字符x,yz

就您而言,您可以安全使用cat file.{1..3} > file

现在,在 的情况下cat file.*>file,您使用了shell 通配符,它生成所有以文件名开头的文件file.,结果将根据当前语言环境中的排序规则进行排序。

您仍然是安全的,但当您拥有超过 10 个文件时,就不再安全了。{1..10}会给你1 2 3 4 5 6 7 8 9 10。当使用通配符时,你会得到1 10 2 3 4 5 6 7 8 9

答案2

区别在于,一个是列表,另一个是序列。{1,2,3}扩展为三个特定元素123{1..3}扩展到 1 到 3 之间的数字列表。在这种特殊情况下,它们是相同的,您可以使用两者中的任何一个。file.*将扩展到当前目录中名称以file..如果只有file.1file.2那么file.3它也等价于其他两个。

至于它引起的问题,我不明白为什么。你可能会想

$ cat file.* > file.txt
cat: file.txt: input file is output file

然而,这是一个完全不同的问题。我能想到的唯一另一个问题是您的 shell 可能无法以正确的顺序列出文件。例如:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

要解决这个问题,您可以使用zsh而不是bash(请参阅这里详情):

% echo f*(n)
file1 file2 file11

一般来说,这三种方法并不相同。这取决于你想做什么。在这三个返回相同输出的情况下,是的,您可以使用它们中的任何一个。没什么区别。所有这些扩展都是由 shell 完成并发生的它们被传递给任何使用它们的命令。

答案3

它们是相同的,但这取决于您安装的 bash 版本是否可用。

页:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4

相关内容