ユーザー入力に先行ゼロを追加しますが、変換にprintfを使用します

ユーザー入力に先行ゼロを追加しますが、変換にprintfを使用します

私は現在、少し「不思議に」動作する次のコードの代替案を探しています。

printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";

入力として入力すると、072これが表示されます。

Please enter the ticket number: 072
0058

入力やコマンドにもっと寛大な方法があるかどうか疑問に思いますreadprintf実際には、文字列の長さをテストせずに前にゼロを追加する素晴らしい方法のようです。

答え1

入力値の前に0がある場合、シェルはそれを8進数として解釈します。

10#たとえば、次のように10進変換を強制できます。

$ printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$((10#$vTICKET))" ); printf "$vTICKET\n";
Please enter the ticket number: 072
0072

Bashでは、たとえばaの結果をprintf変数に直接割り当てることができます。-vprintf -v vTICKET %04d "$((10#$vTICKET))"

また、見ることができますBashが整数の代わりに8進コードを解釈するのを防ぐ方法は?

答え2

Bashでは、前のゼロを削除できます。最初の設定後extglob

$ shopt -s extglob

パラメータの拡張にはafterを使用できます*(0)##

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
000000000000000000000000000000000000072
0072

完了したら、次のコマンドを使用して正常に戻ることができますextglob

$ shopt -u extglob

次に*(0)、デフォルトのパス名拡張を再実行します。

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf(0)72
0072
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf072
bash: printf: asdfasdf072: invalid number
0000

関連情報