我使用这个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"