数字にゼロを埋め込もうとしています
a=010
printf "%04d" $a
0008
値を変換する「0010」として「出力」が必要です。
タイプセットで試してみました
a=010
typeset -RZ2 a
echo $a
スクリプトで同じものを使用すると、次のエラーが発生しました。
Invalid -R option
%08.0f
を使用した新しい回答%f
は10進浮動小数点数を出力するために使用されるため、引数は10進数でなければなりません。
したがって、引数がoctalとして解釈されるリスクはありません。
単純に:
a=0010
a=`printf %08.0f $a`
または
a=$(printf %08.0f $a)
その後
echo $a
00000010
この作業は、POSIX Shellで見つけます
bash を使用すると、printf
の-v
オプションを使用してフォークを回避できます。
a=0010
printf -v a %08.0f $a
echo $a
00000010
%d
を使用)左の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
これは、たとえば "f"指定子などの別の変換指定子を使用して実現できます。 printf manual から:
f、F
Double引数は丸められ、スタイル[-] ddd.dddの10進表記に変換されます。ここで、小数点文字の後の桁数は精度の指定と同じです。精度がない場合は6と見なされます。精度が明示的にゼロの場合、小数点文字は表示されません。小数点が表示される場合は、その前に少なくとも1桁が表示されます。
ただし、実際には数値の浮動小数点表現は必要ないため、ゼロの精度を指定する必要があります。これはそれを行うはずです:
a=010
printf "%04.0f" $a
Linuxを使用していることを前提としていますが、これは他の種類のUnixでも動作するはずです。
typeset -Z4 a
はzsh
またはksh
で機能します。
数値として解釈される場合、POSIX shおよびprintfでは、先行ゼロがある場合、それは8進数として解釈されます。したがって、それらを取り除く必要があります0
s最初:
printf '%04d\n' "${a#"${a%%[!0]*}"}"
または、その問題がないawk
を使用することもできます。
awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"