Ber*_*ard 54 bash brace-expansion arithmetic
当我使用以下内容时,我得到了预期的结果:
$ echo {8..10}
8 9 10
Run Code Online (Sandbox Code Playgroud)
如何以简单的方式使用此大括号扩展以获得以下输出?
$ echo {8..10}
08 09 10
Run Code Online (Sandbox Code Playgroud)
我现在认为这可以使用seq(没有尝试)获得,但这不是我想要的。
有用的信息可能是我仅限于这个 bash 版本。(如果您有zsh解决方案,但没有bash解决方案,也请分享)
$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
dog*_*ane 86
用 a 前缀第一个数字0以强制每个术语具有相同的宽度。
$ echo {08..10}
08 09 10
Run Code Online (Sandbox Code Playgroud)
来自 Brace Expansion 的 bash 手册页部分:
提供的整数可能以 0 为前缀,以强制每个术语具有相同的宽度。当 x 或 y 以零开头时,shell 会尝试强制所有生成的项包含相同数量的数字,并在必要时填充零。
另请注意,您可以使用通过填充前导零来均衡宽度seq的-w选项:
$ seq -w 8 10
08
09
10
$ seq -s " " -w 8 10
08 09 10
Run Code Online (Sandbox Code Playgroud)
如果您想要更多控制,您甚至可以指定 printf 样式格式:
$ seq -s " " -f %02g 8 10
08 09 10
Run Code Online (Sandbox Code Playgroud)
如果你使用 printf
printf "%.2d " {8..10}
Run Code Online (Sandbox Code Playgroud)
这将强制为 2 个字符并添加前导 0。如果您需要 3 位数字,您可以更改为“%.3d”。
小智 8
我有原始海报 ( GNU bash, version 3.2.51(1)-release)的相同 bash 版本{08..12},但对我不起作用,但以下内容有效:
for i in 0{8..9} {10..12}; do echo $i; done
08
09
10
11
12
Run Code Online (Sandbox Code Playgroud)
这有点乏味,但它确实适用于 bash 的 OP 版本(以及更高版本,我认为)。
使用以常量数字开头的范围并将该数字去掉:
echo \ {108..110} | sed 's/ 1//g'
Run Code Online (Sandbox Code Playgroud)
或不使用外部命令:
a=({108..110}); echo "${a[@]#1}"
Run Code Online (Sandbox Code Playgroud)
在 for 循环中使用:
for x in {108..110}; do
x=${x#1}
…
done
Run Code Online (Sandbox Code Playgroud)
虽然在这种情况下,while 循环会更清晰并且适用于任何 POSIX shell:
x=8
while [ $x -le 10 ]; do
n=$((100+x)); n=${n#1}
…
x=$((x+1))
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76510 次 |
| 最近记录: |