数字にゼロを埋めようとします。
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 a
zsh
またはと一緒に使用されますksh
。
POSIX sh と printf で数値として解釈されたときに前にゼロがある場合は、8 進数として解釈されます。したがって、0
まず次のものを削除する必要があります。
printf '%04d\n' "${a#"${a%%[!0]*}"}"
awk
または、この問題なく使用できます。
awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"