shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RES: [shell-script] renomear arquivos


From: Julio Cezar Neves - DISB.O
Subject: RES: [shell-script] renomear arquivos
Date: Wed, 25 Oct 2000 16:37:23 -0300


-----Mensagem original-----
De: # aurelio marinho jargas [mailto:address@hidden]
Enviada em: quarta-feira, 25 de outubro de 2000 15:43
Para: address@hidden
Assunto: Re: [shell-script] renomear arquivos


@ 25/10, Julio Cezar Neves - DISB.O:
> > aurélio escreveu:
> > para complementar, uma dica de bash2, que tem matrizes e uns
> > conceitinhos legais que em determinadas situações, dispensam o
> > uso de cut e sed
> 
> O korn shell (ksh) tb faz tratamento de matrizes e vetores, além de
> instruções típicas para manipulação de numéricos e declaração de tipos de
> variáveis. No entanto evito usá-los, para manter a universalidade dos
> scripts e por estas facilidades do ksh serem muito pouco difundidas.
> 
> Acho uma pena, que o bash2 não tenha tentado seguir tais padrões do ksh,
de
> forma a incrementar o uso de ambos, que seria uma conseqüência lógica da
> padronização.
> 
> Se vc quizer, te mando em pvt um bacalho q desenvolvi, há + de 5 anos,
para
> testar estas implementações.

beleza julio, me mande por favor.

quanto ao bash2, não sei ao certo o motivo da escolha da sintaxe,
mas ela parece familiar a sintaxe das variáveis do bash, pois o
: já era utilizado como separador, como em ${var:-erro}.

Pois é Aurélio, esta sintaxe ${:?} é antiga, e eu a uso muito,
principalmente na forma que vc mostrou ({:-}), para receber um valor
default. Essa bem usada quebra um galhão. A rotina abaixo, que já é bem
antiga e estou precisando dar uma enxugada, incluo em quase todos os meus
programas para fazer uma pergunta. P.ex.: se o programa identifica que o
operador teclou um campo sem preenchimento a linha a seguir será:
Pergunta "Deseja abandonar" S N
a rotina abaixo testará colocará o ponto de interrogação ao final do 1o
parâmetro, a seguir virá o 2o. parâmetro seguido de um par de barras (//),
para convencionar que aquele é o valor default e tudo isso será colocado no
centro da linha 21.
Na volta da rotina basta testar a variável $SN. Repare o uso da construção
{:-}

Pergunta ()
{
    DefVal=`echo "$2" | tr "[a-z]" "[A-Z]"`
    OthVal=`echo "$3" | tr "[a-z]" "[A-Z]"`
    Quest=`echo "$1? $DefVal//"`
    Len=`expr length "$Quest"`
    Col=`expr "(" 80 - "$Len" ")" / 2`
    tput cup 21 $Col
    echo "$Quest\07\c"
    read SN < /dev/tty

    SN=${SN:-"$DefVal"}

    SN=`echo $SN | tr "[a-z]" "[A-Z]"`
    if  [ "$SN" != "$OthVal" ]
    then
        SN="$DefVal"
    fi

    tput cup 21 1
    echo "
"
    return
}

e o bash2 é até incompatível em alguns aspectos do bash1 justo
por forçar mais a compatibilidade com o padrão POSIX, então de
repente a escolha pode ter algo a ver com o POSIX (não achei algo
sobre isso na documentação...)

Mas eu creio que isso será um fator negativo na disseminação do seu uso.

Abaixo o bacalho que usa array e que nunca entrou em produção. Só agora que
reparei q ele tb usa a função Pergunta que descrevi acima. Bom proveito.
[]s,
Julio

Em tempo: TransFTP é um sistema de transmisão de dados que escrevi todo em
shell, que triangula dados emtre nossos mainframes (de muito grande porte),
máquinas Unix e estações Window 9?, praticamente eliminando eventuais erros
de operação.

#!/bin/ksh
#
#  Programa: cadastrapc.sh
#
#  Autor:    Julio Cezar Neves
#
#  Observacoes: Gera e mantem o cadastro /usr/local/var/WorkStations que
#               funciona como um /etc/hosts dos PC que serao utilizados para
#               transmissao de dados via TransFTP.
#

Cab ( )

{
clear
echo "
   +------------+------------+---------------------------------------------+
   |            |   DEST.O   |        Manutencao do Cadastro de PCs        |
   |  DATAPREV  |            |                       Producao RJ (821)2347 |
   |            |   DISB.O   |  Suporte (821)2210             SP (811)6200 |
 
+------------+------------+---------------------------------------------+"
}

Erro ( )

{
    Len=`expr length "$*"`
    Colu=`expr "(" 80 - "$Len" ")" / 2`
    tput cup 21 $Colu
    echo "$*\07\c"
    read a < /dev/tty
    tput cup 21 1
    echo "
"
    return
}

Pergunta ( )

{
    DefVal=`echo "$2" | tr "[a-z]" "[A-Z]"`
    OthVal=`echo "$3" | tr "[a-z]" "[A-Z]"`
    Quest=`echo "${1}"\? "${DefVal}"'//'`
    Len=`expr length "$Quest"`
    Colu=`expr "(" 80 - "$Len" ")" / 2`
    tput cup 21 $Colu
    echo "$Quest\07\c"
    read SN < /dev/tty

    SN=${SN:-"$DefVal"}

    SN=`echo $SN | tr "[a-z]" "[A-Z]"`
    if  [ "$SN" != "$OthVal" ]
    then
        SN="$DefVal"
    fi

    tput cup 21 1
    echo "
"
    return
}

Avanca ( )

{
    Lin=$1
    Col=$2
    case $Col in
        5) Indice $Lin 5
           if  [ -z "${Arr[$Ind]}" ]
           then
               Lin=10
               Col=5
           else
               Col=25
           fi
        ;;
       64) Col=5
           Lin=`expr $Lin + 1`
           if  [ "$Lin" -gt 18 ]
           then
               Lin=10
               Col=5
           fi
        ;;
        *) Col=`expr $Col + 13`
        ;;
    esac
}

Fim ( )

{
    i=0
    j=0
    mv -f /usr/local/var/WorkStations /tmp/$$ 2> /dev/null
    while true
    do
        if  [ -z "${Arr[${i}0]}" -o "(" "$i" -gt 10 ")" ]
        then
            rm /tmp/$$ 2> /dev/null
            exit
        fi
        Linha=${Arr[${i}0]}"\t"
        for j in 1 2 3 4
        do
            Linha=${Linha}${Arr[${i}$j]}" "
        done
        Linha=`echo "$Linha" | cut -f-4 -d" "`
        echo "$Linha" >> /usr/local/var/WorkStations
        i=`expr $i + 1`
    done
}

Indice ( )

{
    a=`expr $1 - 10`
    if  [ "$2" -eq 5 ]
    then
        Ind=${a}0
        return
    else
        Ind=$a`expr \( $2 - 12 \) / 13`
        return
    fi
}

#########################   Corpo do Programa   ###########################

Cab

echo "
   +-------------------+------------+------------+------------+------------+
   | Endereco IP do PC |  apelido1  |  apelido2  |  apelido3  |  apelido4  |
   +-------------------+------------+------------+------------+------------+
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
   |                   |            |            |            |            |
 
+-------------------+------------+------------+------------+------------+"
if  [ -s "/usr/local/var/WorkStations" ]
then
    Lin=10
    cat /usr/local/var/WorkStations |
    while read Linha
    do
        EndIP=`echo "$Linha" | cut -f1`
        Apelidos=`echo "$Linha" | cut -f2`
        tput cup $Lin 5
        echo $EndIP
        Indice $Lin 5
        Arr[$Ind]=$EndIP
        i=1
        for Apelido in $Apelidos
        do
            Col=`expr 12 + $i \* 13`
            tput cup $Lin $Col
            echo $Apelido
            Indice $Lin $Col
            Arr[$Ind]=$Apelido
            i=`expr $i + 1`
        done
        Lin=`expr $Lin + 1`
    done
    Pergunta "Deseja alterar ou incluir dados" S N
    if  [ "$SN" = N ]
    then
        exit
    fi
fi

tput cup 22 2
echo "Para avancar campo tecle <ENTER>; Para eXcluir, posicione cursor e
tecle X"
tput cup 23 8
echo "Faca as alteracoes necessarias e para finalizar tecle <CTRL>+C.\c"
trap "Fim ; exit 0" 2

Lin=10
Col=5
while true
do
    Flg=0
    tput cup $Lin $Col
    read Dado
    if  [ "$Col" -eq 5 -a "(" "$Dado" = x -o "(" "$Dado" = X ")" ")" ]
    then
        tput cup $Lin $Col
        echo "       X        "
        Dado=
        L=$Lin ; C=$Col
        Pergunta "Deseja eXcluir este PC da sua rede" S N
        if  [ "$SN" != N ]
        then
            while true
            do
                Indice $Lin $Col
                NextInd=`expr $Ind + 10`
                NextLin=`expr $Lin + 1`
                tput cup $Lin 5
                echo "               "
                tput cup $NextLin 5
                echo "               "
                if  [ -z "${Arr[$NextInd]}" ]
                then
                    for j in 1 2 3 4
                    do
                        Col=`expr 12 + $j \* 13`
                        tput cup $Lin $Col
                        echo "          "
                        Arr[$Ind]=
                        Ind=`expr $Ind + 1`
                    done
                    Lin=$L ; Col=$C
                    tput cup $Lin $Col
                    Flg=1
                    break
                fi
                Arr[$Ind]=${Arr[$NextInd]}
                Arr[$NextInd]=
                tput cup $Lin 5
                echo ${Arr[$Ind]}
                for j in 1 2 3 4
                do
                    Avanca $Lin $Col
                    Indice $Lin $Col
                    NextInd=`expr $Ind + 10`
                    Arr[$Ind]=${Arr[$NextInd]}
                    tput cup $Lin $Col
                    echo "           "
                    tput cup $Lin $Col
                    echo ${Arr[$Ind]}
                    tput cup $NextLin $Col
                    echo "          "
                done
                Avanca $Lin $Col
            done
            if  [ "$Flg" -eq 1 ]
            then
                continue
            fi
        else
            Indice $Lin $Col
            tput cup $Lin $Col
            echo ${Arr[$Ind]}
            continue
        fi
    fi

    if  [ "$Dado" = x -o "(" "$Dado" = X ")" ]
    then
        Dado=
        Indice $Lin $Col
        L=$Lin ; C=$Col
        while true
        do
            NextInd=`expr $Ind + 1`
            tput cup $Lin $Col
            echo "        "
            if  [ -z "${Arr[$NextInd]}" ]
            then
                Lin=$L ; Col=$C
                tput cup $Lin $Col
                Flg=1
                break
            fi
            tput cup $Lin $Col
            echo ${Arr[$NextInd]}
            Arr[Ind]=${Arr[$NextInd]}
            Arr[NextInd]=
            Avanca $Lin $Col
            Indice $Lin $Col
            tput cup $Lin $Col
            echo "         "
        done
        if  [ "$Flg" -eq 1 ]
        then
            continue
        fi
    fi

    if  [ -z "$Dado" ]
    then
        Avanca $Lin $Col
        continue
    fi

    tput cup $Lin $Col
    if  [ "$Col" -gt 5 ]
    then
        echo "           "
    else
        echo "                "
    fi
    tput cup $Lin $Col
    echo $Dado
    tput cup $Lin $Col
    if  [ "$Col" -gt 5 ]
    then
        x=`echo "${Dado}" | grep -c "   "`
        if  [ "$x" -ne 0 ]
        then
            Erro "Apelido nao pode conter <TAB>"
            tput cup $Lin $Col
            echo "           "
            continue
        fi

        if  [ `echo "$Dado" | grep -c " "` -ne 0 ]
        then
            Erro "Apelido nao pode conter branco"
            tput cup $Lin $Col
            echo "           "
            continue
        fi
    else
        IFSold="$IFS"
        IFS='.'
        set $Dado
        if  [ "$#" -ne 4 ]
        then
            IFS="$IFSold"
            Erro "O ender. IP deve ter 4 numeros com ate 3 algarismos
separados por '.'"
            tput cup $Lin 5
            echo "               "
            Indice $Lin 5
            if  [ -n "${Arr[$Ind]}" ]
            then
                tput cup $Lin 5
                echo ${Arr[$Ind]}
            fi
            continue
        fi
        for j in $Dado
        do
            if  [ "$j" -lt 1 -o "(" $j -gt 254 ")" ]
            then
                IFS="$IFSold"
                Erro "Este nao eh o formato de um endereco IP"
                tput cup $Lin 5
                echo "               "
                Indice $Lin 5
                if  [ -n "${Arr[$Ind]}" ]
                then
                    tput cup $Lin 5
                    echo ${Arr[$Ind]}
                fi
                continue
            fi
        done
        IFS="$IFSold"
    fi

    Indice $Lin $Col
    Arr[$Ind]=$Dado
    Avanca $Lin $Col
done

exit


reply via email to

[Prev in Thread] Current Thread [Next in Thread]