【问题标题】:Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})了解代码({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1 })
【发布时间】:2017-11-28 00:58:47
【问题描述】:

我在Bash shell Decimal to Binary conversion 中看到了以下代码,我想知道它是如何工作的?我尝试谷歌搜索无济于事。

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

echo ${D2B[7]}

上面的代码做了什么?

【问题讨论】:

  • 查找brace expansionbash arrays
  • 这将创建一个带有00000000 00000001 00000010 ... 11111101 11111110 11111111bash‘s brace 扩展的数组。数组 D2B 中的位置代表它的十进制值。
  • 对了,这个也是可以的D2B=({0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1})
  • 为了澄清起见,在这种情况下,大括号扩展具有列出 8 位可以具有的所有 256 个排列的效果(即从 00000000 到 11111111)。因为它是在括号内完成的,所以结果被保存到一个数组中,然后分配给变量 D2B。 echo 命令回显数组的第七个元素。因为排列是有序的,所以第七个元素是 00000111,它是十进制数 7 的二进制。要查看数组中的所有元素,请使用 echo "${D2B[@]}"(双引号很重要)。
  • 其实我认为如果你选择将大括号展开生成的序列解释为大端序,第七个元素才等于“7”。抨击它只是吐出可预测的字符序列(而不是位)。当它们被认为是大端时,它扩展排列的方式是有序的,这只是一个快乐的巧合。我猜如果您使用 {1,0},它们会以相反的顺序列出,如果您使用 tac(即反向猫),您可以将它们转换为 little-endian。但是如果没有进一步的转换,您仍然无法将其保存为二进制文件。

标签: arrays linux bash brace-expansion


【解决方案1】:

{N..M},对于整数字面量 N 和 M,生成从 N 到 M 的整数系列,包括在内,用空格分隔。这称为“brace expansion”,是bashism。如您所见,所有大括号扩展都是在它们之间添加空格之前完成的。

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

【讨论】:

    【解决方案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 Decimal to Binary conversion 中解释的相同方式消除前导零:

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

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多