次の新しい回答%08.0f

次の新しい回答%08.0f

数字にゼロを埋めようとします。

a=010
printf "%04d" $a
0008

値を変換する「0010」は「出力」が必要です。

組版も試しましたが

a=010
typeset -RZ2 a
echo $a

私のスクリプトで同じものを使用すると、次のエラーが発生します。

Invalid -R option

答え1

数字の先頭に「0」を入れないでください。数値は次のように処理されます。8進数によると。 10 進数を指定します。

a=10    
printf "%04d" $a    
0010    

他の場所で数字を読み取る場合は、次のように前のゼロを削除することをお勧めします。

a=0010    
b=$(echo $a | sed 's/^0*//')    
printf "%04d" $a    
0008
printf "%04d" $b    
0010    

答え2

次の新しい回答%08.0f

%f印刷用10進浮動小数点数、議論でなければならない少数。

したがって、主張を次のように解釈するリスクはありません。8進数:

単に以下を行います。

a=0010

a=`printf %08.0f $a` 

または

a=$(printf %08.0f $a)

それから

echo $a
00000010

この仕事はどこでも見つけることができます。POSIX

下に

使用-v、次のオプションを使用してフォークを防ぐことができますprintf

a=0010
printf -v a %08.0f $a
echo $a
00000010

以前の回答(使用済み%d

POSIXの下で

0以下を使用して左の文字を削除できます。

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010

これは新しいコマンドセッションを分岐しないため、使用するよりも優れていますsed

下に

次の構文を使用して、10 進数の解釈を強制できます。

a=000010
printf "%08d" $((10#$a))
00000010

これは変換に役立ちます。

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010

など...

a="zz"
printf "%04d" $((36#$a))
1295

答え3

他の変換指定子(「f」指定子など)を使用してこれを達成できます。 ~からマニュアル印刷:

,F

double 引数は丸められ、[-]ddd.ddd スタイルの 10 進表記に変換されます。ここで、小数点文字の後の桁数は精度仕様と同じです。精度がない場合、6が使用されます。精度が明示的にゼロの場合、小数点文字は表示されません。小数点が表示される場合は、小数点の前に少なくとも1桁が必要です。

ただし、実際には数値の浮動小数点表現をしたくないので、精度をゼロにする必要があります。これにより、トリックを実行できます。

a=010
printf "%04.0f" $a

私はあなたがLinuxを使用していると仮定していますが、これは他のバージョンのUnixでも動作します。

答え4

typeset -Z4 azshまたはと一緒に使用されますksh

POSIX sh と printf で数値として解釈されたときに前にゼロがある場合は、8 進数として解釈されます。したがって、0まず次のものを削除する必要があります。

printf '%04d\n' "${a#"${a%%[!0]*}"}"

awkまたは、この問題なく使用できます。

awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"

関連情報