2015-11-01 50 views
0

我正在調整a bash script of mine以輸出一天中的某一天的序數部分(st,nd,rd,th)。我試圖將其調整爲在date命令中的日期模式內使用。一個月中的某天不是一個整數

下面是一個簡單的測試,以確定是否從date命令月份的一天是一個int:

dayOfMonth=$(date +"%d") && [[ ${dayOfMonth} =~ ^[0-9]+$ ]] && echo ${dayOfMonth} is an int || echo ${dayOfMonth} is NOT an int 

輸出是如我所料

01 is an int 

現在我把代碼放到一個腳本:

#!/bin/bash 
[[ ${1} =~ ^[0-9]+$ ]] && echo ${1} is an int || echo ${1} is NOT an int 

似乎確定:

dateTest.sh 12 
12 is an int 

但是,當我嘗試在date命令中使用它時,該腳本給了我衝突的輸出。 echo看到12但測試是看到%2

date --date='06/12/2012 07:21:22' +"`dateTest.sh %d`" 
12 is NOT an int 

爲了澄清我的目的,腳本的最終結果將是這樣的:

#!/bin/bash 
n=$(date +"%d") 

if [ $# -ge 1 ] ; then 
    n=$1 
    if ! [[ $n =~ ^[0-9]+$ ]] ; then 
     echo Arg dateInteger [$dateInteger] must be an integer. 
     exit 1 
    fi 
fi 

if [ $n -ge 11 -a $n -le 13 ] ; then 
    echo "th" 
else 
case $(($n%10)) in 
1) 
    echo st 
    ;; 
2) 
    echo nd 
    ;; 
3) 
    echo rd 
    ;; 
*) 
    echo th 
    ;; 
esac 
fi 

,這樣我可以這樣說:

date --date='06/12/2012 07:21:22' +"%A, %d`dateTest.sh %d` of %B %Y, %I:%M:%S %p" 

哪會輸出

Tuesday, 12th of June 2012, 07:21:22 AM 

完成的腳本重新寫入。感謝來自@GordonDavisson的輸入,我完成了我的腳本重寫:http://pastebin.com/xZ1afqqC。現在它可以輸出一個整數的序數,也可以輸出完全格式化的日期,您可以使用date中的標準格式字符串,並在序號中加上「%O」。

+0

'請將dayOfMonth = $(日期+ 「%d」)&& [ 「$請將dayOfMonth」 -eq 「$請將dayOfMonth」>的/ dev/null的2>&1] &&回波$ {請將dayOfMonth}是一個int || echo $ {dayOfMonth}不是一個int' –

+0

如果在腳本中添加這樣的作品.... odate ='date --date = '06/12/2012 07:21:22'+「%d」' [[$ odate =〜^ [0-9] + $]] && echo $ odate是一個int || echo $ odate不是int –

+0

謝謝@ DavidC.Rankin - 很好的補充。 –

回答

3

你正在做錯的順序 - 你必須把「%d」變成一個整數(月份的某天)之前把它傳遞給你的腳本,而不是之後。考慮命令:

date --date='06/12/2012 07:21:22' +"`dateTest.sh %d`" 

這樣做是運行dateTest.sh %d,即它通過「%d」作爲參數傳遞給您的腳本。該腳本自然輸出「%d不是一個整數」。然後將其用作date命令的格式字符串,即date --date='06/12/2012 07:21:22' +"%d is not an int"date命令用「天數」替換「%d」部分,並將其餘的單獨留下,給出「12不是整數」。

爲了使這項工作,你必須先獲得天數,然後將其傳遞到您的腳本。事情是這樣的:

dateTest.sh "$(date --date='06/12/2012 07:21:22' +"%d")" 

不幸的是,你的最終結果腳本也想了一堆其他日期格式的做到這一點無法傳遞給dateTest腳本。我認爲,在這種情況下,它會是最好做的階段:

dayWithSuffix="$(dateTest.sh "$(date --date='06/12/2012 07:21:22' +"%d")")" 
date --date='06/12/2012 07:21:22' +"%A, $dayWithSuffix of %B %Y, %I:%M:%S %p" 

BTW,幾個常見的腳本建議:

  • 發送錯誤/調試輸出到stderr,而不是標準輸出,所以它不會與腳本的正常輸出(這裏的問題的一部分)混淆。例如,echo "${1} is NOT an int" >&2

  • 說到這,把包含在雙引號中的字符串變量(如我在這最後例子一樣),以避免空白,通配符等你的結果腳本的怪異misparsing,例如,含有echo Arg dateInteger [$dateInteger] must be an integer. - 您可能沒有意識到,在某些情況下,[$dateInteger]部分將被替換爲文件名列表。

  • 最後,用$(...)代替反引號。在大多數情況下,它們是等價的,但括號版本更易於閱讀,並避免了某些奇怪的內容分析。注意我如何在dayWithSuffix的作業中嵌套兩個這樣的表達式?用反引號正確地處理這個問題非常棘手。

+0

感謝你 - 現在我明白了 - 很明顯 - 我在捕捉「%d」,輸出「%d」並且日期命令正在使用它。哇。 :)感謝您的其他提示 - 我會牢記它們。 –

相關問題