理解代码 ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

6

我在Bash shell 十进制转二进制的问题中看到了以下代码,并想知道它是如何工作的? 我试着去谷歌搜索,但没找到答案。

D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

echo ${D2B[7]}

上面的代码是做什么用的?

查找“花括号扩展”和“Bash 数组”。 - 123
5
这将使用Bash大括号扩展创建一个数组,其元素为00000000 00000001 00000010 ... 11111101 11111110 11111111。在该数组中,D2B所在位置代表其对应的十进制值。 - Cyrus
顺便提一下,这也是可能的 D2B=({0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}) - Cyrus
1
在这种情况下,花括号扩展的效果是列出八位可以有的所有256个排列组合(即从00000000到11111111)。因为它是在括号内完成的,所以结果保存在一个数组中,然后将该数组分配给变量D2B。echo命令回显数组的第七个元素。由于排列是有序的,第七个元素是00000111,这是十进制数7的二进制表示。要查看数组中的所有元素,请使用echo "${D2B[@]}"(双引号很重要)。 - Casey
实际上,我认为只有在您选择将大括号扩展生成的序列解释为大端时,第七个元素才等于“7”。对于Bash来说,它只是输出一系列可预测的字符(而不是位)。当它们被视为大端时,扩展排列的方式是有序的,这只是一个巧合。我猜如果您使用{1,0},它们将以相反的顺序列出,如果您使用tac(即反向cat),则可以将它们转换为小端。但是,如果没有进一步的转换,您仍然无法将其保存为二进制文件。 - Casey
2个回答

5

{N..M},其中N和M是整数文字,生成从N到M(含)的整数序列,用空格隔开。这被称为“花括号扩展”,是一种bashism。正如您所看到的,在它们之间添加空格之前,所有花括号扩展都已完成。

variable=({some expansion})将扩展的每个项放入一个数组中,${variable[index number]}提取该索引处的值。因此,您的代码有效地以二进制字符串形式返回数字七。


一个简单的例子帮助理解:a=({0..1}{2..3}); echo ${a[@]}echo语句打印出所有索引的a - Wolfson

2

另外一个提示:这个结构相当通用,适用于任何基于n的数字系统,其中n最大为9。以八进制为例:

$ D2O=({0..7}{0..7}{0..7}{0..7})
$ echo ${D2O[7]}
0007
$ echo ${D2O[8]}
0010
$ echo ${D2O[668]}
1234
$ echo ${D2O[4095]}
7777

与在Bash shell 十进制转二进制中所解释的方式一样,可以消除前导0:

echo $((10#${D2O[7]}))
7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接