「Date」出力から先行ゼロを削除したり、これらの10進数の8進数解釈を防ぐにはどうすればよいですか?

「Date」出力から先行ゼロを削除したり、これらの10進数の8進数解釈を防ぐにはどうすればよいですか?

私はこれを持っています:

date +"%H hours and %M minutes"

お祭りだと表現したんだけど..「ゼロナインアワー」と書いていますね..「ナインアワー」と言ってほしい!

しかし、日付は常に09を提供するので、bashが簡単に9を作成できるかどうか疑問に思います。

私が試した複雑なスクリプトから

printf %d 09

しかし、失敗しました。8進数ではありません。 :(

どんなアイデアがありますか?

答え1

  • あなたの場合、-日付フォーマット文字列の後に単に追加することでゼロパディングを無効にすることができます。%%-H

    デフォルトでは、日付は数値フィールドをゼロで埋めます。 「%」の後には、次のオプションのフラグが続くことがあります。

    • -(ハイフン)このフィールドを埋めないでください。
    • _(下線)スペース付きパッド
    • 0(ゼロ) 0で埋める
    • ^可能であれば大文字を使用してください
    • #可能であれば逆の場合を使用してください

    バラよりデートブック

  • Bashで他のベースの数を解釈したい場合

    • 0で始まる定数は8進数として解釈されます。
    • 前に0xまたは0Xがある場合は、16進数を表します。
    • それ以外の場合、数値は [base#]n 形式を取ります。ここで、base は算術下数を表す 2 ~ 64 の 10 進数で、n は対応する下数の数字です。

    したがって、数値を10進数として解釈するには、10#n次の形式を使用します。10#09

    echo $((10#09*2))
    18
    

    バラより算術評価Bash マニュアルの一部です。

答え2

10進形式の日付値と比較したい場合は、この方法が非常に効果的であることがわかりました。

let mymin=$(date '+1%M') ; let mymin=$mymin%100

これは常に小数値を生成します。だから私はこれを行うことができます:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

このように、08と09に問題はありません。 %100の代わりに%10を使用すると、0から9までの10分の範囲が提供されます。また、次は前にゼロのない小数値を提供することを発見しました。

echo "$((10#$(date +%M)))"

答え3

0移植可能な変数から先行を簡単に削除できます。先行がない場合、変数は変更されていません0

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

bash、ksh、またはzshでは、kshの追加のglobモードを使用して先行sを必要なだけ削除できます0。 Bashでは、shopt -s extglobまず実行してください。 zshでsetopt kshglob最初に実行します。

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"

答え4

通常、bashでは次のようになります。

test ${#number} -eq 2 && number=${number#0}

~につながる

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

または別の方法:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

日付に適切な書式設定オプションがないことに驚きました。

関連情報