我用這個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"
但它不工作(讀的最後一個腳本大寫評論):(
幫助!
爲什麼你需要用它來/ bin/sh的運行?在Solaris 10及更早版本中,此外殼不是用於新腳本,而是僅用於保證與舊腳本的兼容性。編輯:對不起,我剛剛注意到你似乎使用Linux,而不是Solaris,所以此評論不適用。 – jlliagre 2011-06-05 21:16:10
不,我使用Solaris(實際上我們的客戶使用它,而且我正在爲他們編寫這個腳本)。但我必須使用/ bin/sh(所以我的老闆說,儘管我不同意)。無論如何,geekosour的帖子有所幫助。謝謝你的努力:) – Eedoh 2011-06-05 21:39:54
如果你的老闆希望你使用sh而不是ksh,那麼在Solaris上選擇符合POSIX標準的bourne shell:'#!/ usr/xpg4/bin/sh' – jlliagre 2011-06-06 09:47:13