私は現在、少し「不思議に」動作する次のコードの代替案を探しています。
printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";
入力として入力すると、072
これが表示されます。
Please enter the ticket number: 072
0058
入力やコマンドにもっと寛大な方法があるかどうか疑問に思いますread
。printf
実際には、文字列の長さをテストせずに前にゼロを追加する素晴らしい方法のようです。
答え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
変数に直接割り当てることができます。-v
printf -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