Перевод функции преобразования даты #! / Bin / ksh в #! / Bin / sh - PullRequest
0 голосов
/ 05 июня 2011

Я использовал эту функцию ksh для преобразования формата «1 января 2011» в «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 "[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"

Но это не сработает (прочитайте UPPERCASE комментарий в последнем скрипте): (

Помощь!

1 Ответ

2 голосов
/ 05 июня 2011

Проблема в том, что выполнение команды read в подоболочке из-за конвейера зависит от того, какая именно оболочка /bin/sh;вы получите одно поведение от bash и другое от устаревшей UNIX (например, Solaris) /bin/sh.Вместо этого используйте set.

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

, хотя я, вероятно, написал бы

oIFS="$IFS"
IFS=-
set -- $1
IFS="$oIFS"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...