八进制

八进制

我正在尝试创建一个新变量,其中 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

相关内容