2016-06-27 5 views
0

単純なbashスクリプトを作成します。入力は「HH:MM」である文字列と出力がその時刻に秒残っている、例えば入力から残りの秒を取得するHH:mm bash(OSX)

$ getsec.sh 12:55 # now it's 12:30. so 25 minutes left. 
1500 

私はdateコマンドにこののでしょう、おそらく溶液を使用して思いました。しかし、それは私が使用できる単純な方法では存在しないようです。

(いくつかの答えをチェックした後に追加しました)

dateコマンドは、OSやバージョンによって異なりように見えます。
私はOSXを使用していますが、提案された回答の結果は次のとおりです。

$ date -d '12:55' '+%s' 
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
      [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] 
+2

ahはい私は、OSXはFreeBSDの 'date'をGNUの日付ではないと思っています –

答えて

2

* BSD dateコマンドは(など自作とOSX、フィンク、を含む他の多くのプラットフォーム上でLinux上でユビキタスと利用できるGNU date、より異なるオプションの構文を持っています)。

ポータブルなソリューションの場合は、ポータブルスクリプト言語を使用してください。

+0

トピック: '-d'は' GNU'と 'BSD'で異なることを意味します。 ( 'GNU'' -d'は' BSD'' -j'です)長いオプション(この場合は '--date')を使う方が良いでしょうか?その長いオプションは不明なオプションと呼ばれるので、引数を間違った方法で解釈するのではなく、おそらく失敗します。 – anishsane

+0

@anishsane正規の形式であるか、 '-f'オプションを渡すことで日付が必要です。また、 '-j'の意味は無関係です。このオプションを指定しないと、* BSD 'date'はシステムクロックを設定しようとします。 – tripleee

1

あなたは行うことができます。

ts=$(date -d '12:55' '+%s') 
now=$(date '+%s') 

diff=$((ts-now)) 
+0

トピック:' -d'は 'GNU'と' BSD'で異なることを意味します。長いオプション(この場合は '--date')を使う方が良いでしょうか?その長いオプションは不明なオプションと呼ばれるので、引数を間違った方法で解釈するのではなく、おそらく失敗します。 – anishsane

1

このスクリプトでは、パラメータとしてスクリプトにアクセスし、コマンドライン引数として目標時間を(受け入れ$1

#!/bin/bash 

current_time=$(date +%s) 
target_time=$(date +%s --date="$1") 

# evaluate the difference using an arithmetic expression 
echo "seconds remaining to target time: "$((target_time - current_time)) 

用法:

% ./get_sec.sh "22:00" 

出力:(したがって、OSX)

seconds remaining to target time: 16151 
関連する問題