私はこれを持っています:
date +"%H hours and %M minutes"
私はフェスティバルを使ってそれを言います..しかし、それは「ゼロ9時間」のように言います。
しかし、日付は常に私に09を与えます...だから、bashはそれを簡単に9にすることができますか?
私が試した複雑なスクリプトで
printf %d 09
しかし、失敗します.. 8進数ではありません:(
何か案が?
私はこれを持っています:
date +"%H hours and %M minutes"
私はフェスティバルを使ってそれを言います..しかし、それは「ゼロ9時間」のように言います。
しかし、日付は常に私に09を与えます...だから、bashはそれを簡単に9にすることができますか?
私が試した複雑なスクリプトで
printf %d 09
しかし、失敗します.. 8進数ではありません:(
何か案が?
回答:
あなたの場合、日付のフォーマット文字列の-
後%
に追加することで、ゼロパディングを無効にすることができます:%-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マニュアルの算術評価セクションを参照してください。
echo $((011)) $((10#011))
その出力を別の良い例です9 11
lat=048 ; latd=${lat#0} ; echo $((latd-1))
が、lat=-048 ; latd=${lat#0} ; echo $((latd-1))
機能しません。
plus=$((10#01))
日付値と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)))"
移植性があるため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パターンを使用して、任意の数の先行0
s を削除できます。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"
一般的に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
日付に適切な形式オプションがないことに驚いています。