将#!/ bin / kshdate转换函数翻译成#!/ bin / sh

我使用这个ksh函数将“2011年1月1日”格式转换为“1.1.2011”。

#!/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 "[AZ][az][az]"` ## 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 '[az]' '[AZ]'` months=`cal $yyyy | grep "[AZ][az][az]" | tr '[az]' '[AZ]'` 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" 

但它不起作用(请阅读最后脚本中的大写注释):(

帮帮我!

问题是, read命令是否由于流水线而在子shell中运行取决于确切的shell /bin/sh ; 您将从bash获得一个行为,而从旧UNIX(例如Solaris) /bin/sh获得另一个行为。 改用set

 set -- `echo $1 | awk -F"-" '{print $1,$2,$3}'` 

尽管我可能会写

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