8進数

8進数

0 から 9 までの数字が常に 0...9 ではなく 00...09 で表示される新しい変数を作成しようとしています。以下は、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

この変数も切り取った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

では、長さ2の拡張子が0で切り取られた左パッドをzsh参照してください。${(l:2::0:)expansion}

POSIXlyでは、いつでも次のものを使用できます。

printf '%02d\n' "$var"

しかし、そうではないことを参考にしてくださいカット最大2桁(ほとんどの場合も同様)で、10進整数文字列でのみ機能します。

注意してください:

$ bash -c "printf '%02d\n' 010"
08

(yash、dash、またはGNUと同じです。printfこれは実際にはPOSIXの要件です。)

答え4

特定の種類の形式を取得するには、具体的にお問い合わせください。

$int幅が埋められていない場合は、0()の前にあるnビットの固定幅整数を印刷するには、次のようにします。

printf '%0*d' "$n" "$int"

例:

$ printf '%0*d' 4 25
0025

$ printf '%0*d' 10 7
0000000007

任意の数字を印刷してください一つ先行0:

$ printf '0%d' 7
07

8進数

ただし、シェル(kshとzshを除く)では、数値が原因で08エラーが発生します。

$ dash -c 'i=08; echo $((i+1))'
dash: 1: Illegal number: 08

これは、一部のシェルでゼロで始まる数字がデフォルトの8(8進数)数字として解釈されるためです。 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

関連情報