在 bash 中创建从 08 到 10 的数字范围不包括一位数字前面的 0

在 bash 中创建从 08 到 10 的数字范围不包括一位数字前面的 0

在我运行 CentOS 7.2 的本地计算机上,当我执行以下操作时:

for i in {8..12}; do echo ${i}; done

我有:

8
9
10

但是当我这样做时:

for i in {08..10}; do echo ${i}; done

我有:

08
09
10

但在我有权访问的运行 CentOS 5.6 的服务器上,运行这两个命令会产生相同的输出:

8
9
10

为什么8和9前面没有0?是因为bash版本的原因,还是只是环境配置的原因?我可以在每个会话中更改它还是永久更改它,以便我的服务器会将零放在小于 10 的数字前面?

答案1

您的 CentOS 5.6 机器上的很可能bash是版本 3。大括号扩展中的整数零填充是在 的版本 4 中引入的bash

解决方案是将您的安装更新bash到更新版本,或者使用生成零填充整数的替代方法,例如

printf '%02d\n' {8..10}

或者,类似的东西

for i in 0{1..9} {10..20}; do
    echo "$i"
done

也会起作用。

答案2

bash您可以使用zsh该语法的来源,而不是使用。

zsh自 1995 年以来一直支持{08..10}(在 2.6-beta4 中引入),因此将在任何版本的 CentOS 中可用zsh(2004 年 CentOS 的第一个版本)。

您实际上zsh在示例中使用了语法,就像bash您需要的那样echo "${i}",而不是echo ${i}为了扩展$i不受到分词(因此依赖于$IFS)。

答案3

或者,您可以使用seq命令

$ seq -f "%02g" 8 10
08
09
10

相关内容