2011-06-05 66 views
0

我用這個ksh函數將「2011年1月1日」格式轉換爲「1.1.2011」。將#!/ bin/ksh日期轉換功能翻譯成#!/ bin/sh

#!/bin/ksh 

##---- function to convert 3 char month into numeric value ---------- 
convertDate() 
{ 
    echo $1 | awk -F"-" '{print $1,$2,$3}' | read day mm yyyy ## split the date arg 
    typeset -u mmm=`echo $mm` ## set month to uppercase 
    typeset -u months=`cal $yyyy | grep "[A-Z][a-z][a-z]"` ## uppercase list of all months 
    i=1 ## starting month 
    for mon in $months; do ## loop thru month list 
    ## if months match, set numeric month (add zero if needed); else increment month counter 
    [[ "$mon" = "$mmm" ]] && typeset -xZ2 monthNum=$i || ((i += 1)) 
    done ## end loop 
    echo $day.$monthNum.`echo $yyyy | cut -c3-` ## return all numeric date format ddmmyyyy 
} 

但我需要在#!/ bin/sh中使用這個函數。所以我試圖重寫它...

#!/bin/sh 

##---- function to convert 3 char month into numeric value ---------- 
convertDate() 
{ 
    echo $1 | awk -F"-" '{print $1,$2,$3}' | read day mm yyyy ## split the date arg 
    echo $mm #IT SEEMS LIKE THE PROBLEM IS IN THE PREVIOUS LINE, BECAUSE THIS VARIABLE IS EMPTY IN #!/bin/sh, BUT IF YOU CHANGE IT TO #!/bin/ksh EVERYTHING SEEM TO BE FINE, THEN FUNCTION WORKS CORRECTLY. 
    mmm=`echo $mm | tr '[a-z]' '[A-Z]'` 
    months=`cal $yyyy | grep "[A-Z][a-z][a-z]" | tr '[a-z]' '[A-Z]'` 
    i=1 ## starting month 
    for mon in $months; do ## loop thru month list 
    ## if months match, set numeric month (add zero if needed); else increment month counter 
    if [ "$mon" = "$mmm" ]; then 
     monthNum=`printf '%02d' $i` 
    else 
     i=`expr $i + 1` 
    fi 
    done ## end loop 
    echo $day.$monthNum.`echo $yyyy | cut -c3-` ## return all numeric date format ddmmyyyy 
} 

convertDate "20-May-2010" 

但它不工作(讀的最後一個腳本大寫評論):(

幫助!

+0

爲什麼你需要用它來/ bin/sh的運行?在Solaris 10及更早版本中,此外殼不是用於新腳本,而是僅用於保證與舊腳本的兼容性。編輯:對不起,我剛剛注意到你似乎使用Linux,而不是Solaris,所以此評論不適用。 – jlliagre 2011-06-05 21:16:10

+0

不,我使用Solaris(實際上我們的客戶使用它,而且我正在爲他們編寫這個腳本)。但我必須使用/ bin/sh(所以我的老闆說,儘管我不同意)。無論如何,geekosour的帖子有所幫助。謝謝你的努力:) – Eedoh 2011-06-05 21:39:54

+1

如果你的老闆希望你使用sh而不是ksh,那麼在Solaris上選擇符合POSIX標準的bourne shell:'#!/ usr/xpg4/bin/sh' – jlliagre 2011-06-06 09:47:13

回答

2

的問題是,是否read命令在子shell中運行,由於管線取決於到底是哪殼/bin/sh是,你會得到一個bash行爲和另一名來自傳統的UNIX(如Solaris)上/bin/sh使用set代替

雖然我可能會寫

oIFS="$IFS" 
IFS=- 
set -- $1 
IFS="$oIFS" 
+0

很棒! for(int i = 0; i <1000000; i ++){cout <<「Thank You!\ n」; }我知道這個「謝謝」是C++,而不是shell,但我認爲它是doo:D – Eedoh 2011-06-05 19:45:42