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