特定の入力に対して奇妙な私のスクリプトから、次の簡単な抜粋を抽出しました。
echo -e "Enter the Day of the Month : \c "
read input_day
printf -v input_day '%02d' "$input_day"
これにより、ユーザーが単一の数字(2)を入力すると、その数字は02に変換されます。これが私の最初の要求です。これは、02などの2桁の数字を入力しても機能します。それでは02にそのままにします。これは、12などの2桁の数字にも当てはまります。しかし、奇妙なことは、数字08と09を受け入れることができないということです。 08または09を入力したときに表示されるエラーです。
Enter the Day of the Month : 08
2: line 20: printf: 08: invalid number
なぜですか? printfヘルプページを読み取ろうとしましたが、「d」が符号付き10進整数を意味することを示しています。したがって、数字8と9を許可する必要があります。それとも私が何かを見逃しているのでしょうか?私の要件は、ユーザーが1桁の「8」と2桁の「08」で日付を入力できる必要があることです。
答え1
bash
前に0がある数字は8進数として解釈されます。型が問題ではなく、$input_day
変数が問題です。
さまざまな方法を使用して削除できます(例を参照)。awk は C の LTRIM 関数と同じです。)。
追加資料:
iptablesに変数を渡す前に、先行ゼロを削除してください。
次の構文を使用してください$((10#$machinenumber))
。たとえば、次のようになります。printf -v input_day '%02d' "$((10#$input_day))"
Bash:変数から先行ゼロを削除します。
さらに重要なのは:shopt -s extglob printf -v input_day '%02d' ${input_day##+(0)}
ちなみに、例では変数が空であることを確認しません。しかし、これを正しく検証することは別の問題になります。