我正在尝试创建一个新变量,其中 0 到 9 之间的数字应始终表示为 00...09 而不是 0...9。这是我的测试,没有用于 POC 目的的实际命令:
for i in {00..23}; do hourPlus=$((i+1)); echo $i $hourPlus; done
哪个输出:
00 1
01 2
02 3
03 4
04 5
05 6
06 7
07 8
08 9
09 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
然而,我期待的是这样的事情:
00 01
01 02
02 03
03 04
04 05
05 06
06 07
07 08
08 09
09 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
任何人都知道如何让它按照我的预期为我的 for 循环正常工作?
答案1
这是一个适合您的功能:
two_digits_zero_fill ()
{
# print the number as a string with a leading zero
printf '%02d\n' "$1"
}
甚至更普遍:
leading_zero_fill ()
{
# print the number as a string with a given number of leading zeros
printf "%0$1d\\n" "$2"
}
后者的用法:
number=7
leading_zero_fill 3 "$number"
将打印出:
007
答案2
将回显部分替换为
printf '%02d %02d\n' $i $hourPlus
编辑:事实上,除非您使用 hourPlus 的最终值:
for i in {0..23}; do printf '%02d %02d\n' $i $((i + 1)); done
答案3
使用(尽管可以在 ksh93 中使用,但ksh
不支持)或(扩展的来源),即:{00..23}
{0..23%02d}
zsh
{00..23}
typeset -Z2 var
然后:
$ var=0
$ echo "$var"
00
$ ((var++))
$ echo "$var"
01
请注意,它仅影响变量的扩展,而不影响算术扩展:
$ echo "$((var+1))"
2
请注意,该变量也是被截断的到两位数:
$ var=123
$ echo "$var"
23
zsh$ echo $((var)) # value is still 123, only the expansion is truncated
123
ksh$ echo "$((var))" # value truncated upon assignment
23
在 中zsh
,另请参阅${(l:2::0:)expansion}
用 0 向左填充(并截断)长度为 2 的扩展。
POSIXly,您始终可以使用:
printf '%02d\n' "$var"
但请注意,它不截短到 2 位数字(在大多数情况下也是如此)并且仅适用于十进制整数字符串:
提防:
$ bash -c "printf '%02d\n' 010"
08
(与 yash、dash 或 GNU 相同printf
,这实际上是 POSIX 要求)。
答案4
如果您希望获得某种类型的格式,您应该专门询问。
$int
如果宽度未填充,则打印固定宽度为 n 位并带有前导零的整数 ( ) 可以通过以下方式完成:
printf '%0*d' "$n" "$int"
例子:
$ printf '%0*d' 4 25
0025
$ printf '%0*d' 10 7
0000000007
打印任何数字一前导零:
$ printf '0%d' 7
07
八进制
但在 shell 中(ksh 和 zsh 除外),数字08
会生成错误:
$ dash -c 'i=08; echo $((i+1))'
dash: 1: Illegal number: 08
这是因为,在某些 shell 中,以 0 开头的数字会被解释为以 8 为基数(八进制)的数字。在八进制中,数字 8 不存在。因此,您需要其他方法来进行数学计算,例如 bc:
$ i="008"; echo "$i + 1 " | bc
9
简而言之,您需要类似的东西:
for i in {00..23}; do hP=$( echo "$i+1" |bc ); printf '%s %02d\n' "$i" "$hP"; done