「日付」の出力から先行ゼロを削除する、またはそのような10進数の8進解釈を回避するにはどうすればよいですか?


37

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

date +"%H hours and %M minutes"

私はフェスティバルを使ってそれを言います..しかし、それは「ゼロ9時間」のように言います。

しかし、日付は常に私に09を与えます...だから、bashはそれを簡単に9にすることができますか?

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

printf %d 09

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

何か案が?


OP、あなたの受け入れられた答えは素晴らしいです-あなたの特定の場合には、しかしそれは質問のタイトルと一致しません。
アインポクルム-モニカを

@ilkkachuという古いタイトルは、8進形式の数値の10進解釈を強制することを求めて、この質問を見つけるための鍵となりました。
ムル

@muru、はい、8進数のメモをそこに貼り付けられるかと思いましたが、いい言い回しは思いつきませんでした。もちろん、それを変更できます。少なくとも、何を検索したか知っていますか?答えと質問は、依然として主に先行ゼロを削除することに関するもののようです。
-ilkkachu

回答:


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

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

    • - (ハイフン)フィールドを埋めない
    • _ (アンダースコア)スペースで埋める
    • 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
thx、非常に詳細!ところで、echo $((011)) $((10#011))その出力を別の良い例です9 11
アクエリアスパワー

1
これは負の数では機能しません。機能しますlat=048 ; latd=${lat#0} ; echo $((latd-1))が、lat=-048 ; latd=${lat#0} ; echo $((latd-1))機能しません。
ルイスA.フローリット

plus=$((10#01))
ベコ博士

2

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

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

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

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

この方法で08または09を使用しても問題はありません。%100の代わりに%10を使用すると、0から9までの10分間の範囲が得られます。また、次のように、先行ゼロなしで10進値が得られることがわかります。

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

2

移植性があるため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パターンを使用して、任意の数の先行0s を削除できます。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"

1

一般的に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

日付に適切な形式オプションがないことに驚いています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.