2016-06-27 27 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命令取決於操作系統和版本。
我使用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 yes我認爲OSX使用freeBSD'date'而不是GNU日期 –

回答

2

的* BSD(並因此OSX)date命令具有比GNU date,這是無處不在Linux和可以用許多其它的平臺(包括OSX,與自制,芬克等不同的選項語法)。

now=$(date -j +%s) 
then=$(date -j -f '%H:%M' 12:55 +%s) 
echo "$((then-now)) seconds left" 

對於便攜式解決方案,可能使用便攜式腳本語言代替。

+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" 

輸出:

seconds remaining to target time: 16151