Fundamentos de Programação Aplicada a Redes ­ 
Shell Script
Controle de Fluxo
                                       Frederico Madeira
                                     LPIC­1, LPIC­2, CCNA
                                     fred@madeira.eng.br
                                      www.madeira.eng.br
Saída e Código de Saída

✔   O comando utilizado para terminar um script é o exit
✔   Ele pode ser utilizado para retornar um valor
✔   Todo comando retorna um status
     ✔ Se finalizado com sucesso o exit code é 0
     ✔ Se finalizado com falha, o exit code é um valor numérico diferente de
       zero


#!/bin/bash
echo “Teste exit code”              Retornará 0 indicando que o comando foi ok.
echo $?

lskdf # Comando desconhecido         Retornará um valor diferente de 0 indicando
echo $?                                               um erro

exit 113 # Irá retornar 113 para o shell.
Por convenção, os comandos retornam 0 para indicar sucesso ou
retornam um valor diferente de zero para indicar um erro ou uma
condição de erro
Condicionais: TEST e IF

Teste Condicional – IF

if [ “$NOME” = “Fred” ]
then
   echo “Seja bem vindo Fred”
else
   echo “Acesso não Permitido”
fi

Teste Condicional – TEST

test “CONDIÇÃO” && echo “Condição verdadeira” || echo “Condição falsa”
Condicionais: TEST e IF

Exemplo IF:

 #!/bin/bash

 echo -n "Digite seu primeiro nome: "
 read NOME

 if [ “$NOME” = “Fred” ]
 then
   echo “Seja bem vindo $NOME”
 else
   echo “Acesso não Permitido”
   exit 127
 fi

 exit 0
Condicionais: TEST e IF

Exemplo TEST:



 #!/bin/bash

 echo “Verificação do sistema, devo prosseguir [s/n] ?”
 read RESPOSTA

 test “$RESPOSTA” = “n” && exit 2

 echo "bla bla bla"

 exit 0
Condicionais: TEST e IF

             Testes em arquivos                      Testes em variáveis
 -b           é um dispositivo de bloco
 -c        é um dispositivo de caractere             Comparação Numérica
 -d                  é um diretório              -lt   é menor que (LessThan)
 -e                 o arquivo existe            -gt é maior que (GreaterThan)
 -f              é um arquivo normal            -le   é menor igual (LessEqual)
 -g            o bit SGID está ativado          -ge é maior igual (GreaterEqual)
-G    o grupo do arquivo é o do usuário atual   -eq         é igual (EQual)
 -k           o sticky-bit está ativado         -ne     é diferente (NotEqual)
 -L         o arquivo é um link simbólico
-O      o dono do arquivo é o usuário atual         Comparação de Strings
 -p          o arquivo é um named pipe          “=”          é igual
 -r      o arquivo tem permissão de leitura     !=         é diferente
 -s   o tamanho do arquivo é maior que zero     -n         é não nula
-S              o arquivo é um socket           -z           é nula
 -t   o descritor de arquivos N é um terminal
 -u            o bit SUID está ativado                Operadores Lógicos
-w      o arquivo tem permissão de escrita       !      NÃO lógico (NOT)
 -x   o arquivo tem permissão de execução       -a        E lógico (AND)
-nt   o arquivo é mais recente (NewerThan)      -o        OU lógico (OR)
-ot     o arquivo é mais antigo (OlderThan)
-ef       o arquivo é o mesmo (EqualFile)
Condicionais: TEST e IF

Prática: Script idade.sh

Escreva um script que pergunte sua idade, pergunte seu sexo e seu nome
de usuário neste sistema.

Informar:

- É maior de idade ?
- Seu sexo é masculino ou feminino ?
- Possui um diretório home neste servidor ?

PS: Faça duas versões, uma usando if e outra usando test
Condicionais: TEST e IF
Resposta: Script idade.sh



#!/bin/bash

echo "------------------------------------------------------"   if [ "$SEXO" = "M" ]
echo -n "Qual sua idade ? "                                     then
read IDADE                                                            echo "Sexo Masculino"
echo -n "Qual seu sexo [M/F]? "                                 else
read SEXO                                                             echo "Sexo Feminino"
echo -n "Qual é seu nome de usuário ? "                         fi
read USUARIO
echo "------------------------------------------------------"   if [ -d "/home/$USUARIO" ]
echo""                                                          then
                                                                       echo "Você possui o home: /home/$USUARIO"
if [ $IDADE -ge 18 ]                                            else
then                                                                   echo "Você nao possui um home neste sistema"
        echo "Você é MAIOR de idade";                           fi
else
       echo "Você é MENOR de idade";                            exit 0
fi
Condicionais: TEST e IF
  Resposta: Script idade.sh
#!/bin/bash

echo "------------------------------------------------------"
echo -n "Qual sua idade ? "
read IDADE
echo -n "Qual seu sexo [M/F]? "
read SEXO
echo -n "Qual é seu nome de usuário ? "
read USUARIO
echo "------------------------------------------------------"
echo""

test $IDADE -ge 18 && echo "Você é MAIOR de idade" || echo "Você é MENOR de idade"

test "$SEXO" = "M" && echo "Sexo Masculino" || echo "Sexo Feminino"

test -d "/home/$USUARIO" && echo "Você possui um home: /home/$USUARIO" ||
 echo "Você não possui um home neste sistema"

exit 0
Condicionais: TEST e IF

Prática: Script backup.sh

Melhore o script backup.sh desenvolvido anteriormente e informe ao final
uma mensagem informando se o backup foi concluído com sucesso e se
o arquivo existe realmente no local indicado.
Condicionais: TEST e IF
 Resposta: Script backup.sh

#!/bin/bash

OUT_DIR=/opt/backup/
HOSTNAME=$(hostname)
AGORA=$(date +"%Y%m%d-%H%m")
BKP_FILE="sysbkp_$HOSTNAME_$AGORA.tar.gz"
DIRS="/etc /home /var/www/var/lib/mysql"
                                                if [ -e “$OUT_DIR/$BKP_FILE” ]
                                                then
echo "Realizando backup do sistema...."
                                                      echo “arquivo existe”
cd $OUT_DIR
                                                else
tar cvfz $BKP_FILE $DIRS
                                                      echo “arquivo não existe”
                                                fi
If [ “$?” != 0 ]
then
          echo “Falha na execução do Backup”
else
          echo “Backup executado com sucesso”
fi
Condicionais: CASE

Permite a comparação de uma variável com muitos valores

Sintaxe:


case $VALOR in
   1)
   echo “Você escolheu 1”
   ;;
   2)
   echo “Você escolheu 2”
   ;;
   *)
   echo “Você não escolheu nem 1 e nem 2”
   ;;
esac
Condicionais: CASE

Exemplo::


#!/bin/bash

echo ""
echo "Escolha uma das seguintes pessoas"
echo ""
echo "--------------------------------"
echo "1. Frederico Madeira"
echo "2. Alberto Viegas"
echo "3. Luciano Cabral"
echo ""
echo -n "Qual deles vocÊ deseja obter iformações: "
read ESCOLHA


                                                      Continua ->
Condicionais: CASE
Exemplo::

case $ESCOLHA in
  1)
     echo ""
     echo "Professor das cadeiras de Linux/Shell/SD e VoIP"
     echo "Email: fred@madeira.eng.br"
     ;;
  2)
     echo ""
     echo "Professor das cadeiras de Linux/Shell/SD e Segurança"
     echo "Email: alviegas@gmail.com"
     ;;
  3)
     echo ""
     echo "Professor das cadeiras de Windows/Redes Ethernet"
     echo "Email: lscabral@gmail.com"
     ;;
  *)
     echo ""
     echo "Qualquer outra opção cai aqui"
     ;;
esac
Condicionais: CASE

Script: sysinfo2.sh

Crie um script que exiba informações sobre o sistema. Ele deve ter a seguinte
interface:

1) Espaço livre nos discos
2) Status da Memória do sistema
3) Informações sobre o Processador
4) Endereço IP
5) Quem está logado no sistema

ENTRE COM A OPÇÃO DESEJADA:
Condicionais: CASE

Script sysinfo2.sh


#!/bin/bash

# Exibição do Menu

echo "1) Espaço Livre nos Discos"
echo "2) Status da Memória do Sistema"
echo "3) Informações sobre o Processador"
echo "4) Endereço IP"
echo "5) Quem está logado no sistema"
echo ""
echo -n "Escolha a opção: "

# Leitura da opção do usuário
read OPCAO                                  Continua ->
Condicionais: CASE

Script sysinfo2.sh


# Trata a opção escolhida pelo usuário
case $OPCAO in
     1) df -h
     ;;
     2) free
     ;;
     3) cat /proc/cpuinfo
     ;;
     4) /sbin/ifconfig
     ;;
     5) w
     ;;
     *) echo "Não foi escolhida uma opção válida"
     ;;
esac
LOOPS: for

Loop é um bloco de código que se repete para enquanto uma condição
for verdadeira.

Sintaxe:


for arg in [list]
do
    Comando 1
    Comando 2
    Comando 3
    ....
done
LOOPS: for

Exmplo


#!/bin/bash
# Fazendo um loop dada uma sequência numérica

for NUMBER in 1 2 3 4 5 6 7 8 9 10
do
     echo "O número é: $NUMBER"
done
LOOPS: for

Exmplo


#!/bin/bash
# Fazendo um loop através de variáveis

ARQUIVOS="/ect/passwd
/etc/crontab
/etc/sysconfig/network
/etc/fakefile
/opt/sportclube
/usr/sbin/shutdown"

for LISTA in $ARQUIVOS
do
     echo "O arquivo é: $LISTA"

done
LOOPS: for

Exmplo


#!/bin/bash
# Fazendo um loop através de variáveis carregadas dinamicamente


echo -n "Informe um diretório: "
read DIR

LISTA=$(ls $DIR)
for ARQ in $LISTA
do
     echo "O arquivo é: $ARQ"
done
LOOPS: for

Script: file_exist.sh

Faça um script que verifique se a lista de arquivos abaixo existe e informe ao
usuário.

/ect/passwd
/etc/crontab
/etc/sysconfig/network
/etc/fakefile
/opt/sportclube
/usr/sbin/shutdown
LOOPS: for

Script: file_exist.sh

#!/bin/bash

ARQUIVOS="/ect/passwd
/etc/crontab
/etc/sysconfig/network
/etc/fakefile
/opt/sportclube
/usr/sbin/shutdown"

for LISTA in $ARQUIVOS
do
     if [ -e "$LISTA" ]
     then
            echo "$LISTA existe"
     else
            echo "$LISTA não existe"
     fi
done
LOOPS: for

Script: ping_hosts.sh

Salve a lista abaixo no arquivo hosts.lst e envie 1 pacote ICMP para cada um,
ao final informe se o host está ativo ou não. Ordene os hosts em ordem
alfabética antes de começar a executar os pings.

Www.madeira.eng.br
Www.uol.com.br
Www.linux.com
Www.fedoraproject.og
Www.terra.com.br
www.jc.com.br

Dica: Faça verificação do exit code de cada comando ping
LOOPS: for

Script: file_exist.sh

#!/bin/bash

LISTA=$(sort hosts.lst)

for HOST in $LISTA
do
     ping -c 1 $HOST &> /dev/null && echo "Host $HOST está
ativo" || echo "HOST $HOST está offline"
done
LOOPS: for

Script: new_ls.sh

Escreva um script que solicite ao usuário um diretório, informe para cada
objeto encontrado neste diretório:
   - se ele é um diretório
   - Se é um arquivo
   - Se é um link,
   - Se for arquivo, informe se seu tamanho é maior do que zero.

O diretório pode ser informado como parâmetro para o comando ou de forma
interativa para o usuário
Valide se o diretório informado existe ou não

Dicas:

$* - Lista dos Argumentos passados
$# - Quantidade de argumentos passados
$1 - Primeiro Argumento
$2 – Segundo Argumento
LOOPS: for

Script: new_ls.sh

#!/bin/bash

if [ -z "$1" ]
then
       # entra aqui se não for passado parâmetro
       echo -n "Insira o diretório desejado: "
       read DIR
else
       # entra aqui se for passada algum parametro
       DIR=$1
fi
LOOPS: for
if [ -d "$DIR" ]
then
       # Se for um diretório váldio, executa
       LISTA=$(ls $DIR)
       for ARG in $LISTA
       do
            if [ -d "$DIR/$ARG" ]
            then
                   echo "$ARG - Diretório"
            else
                   if [ -L "$DIR/$ARG" ]
                   then
                          echo "$ARG - Link"
                   else
                          if [ -e "$DIR/$ARG" ]
                          then
                                 echo -n "$ARG - Arquivo - "
                                 if [ -f "$DIR/$ARG" ]
                                 then
                                       echo "Arquivo maior do que zero"
                                 else
                                       echo "Arquivo zerado"
                                 fi
                          fi
                   fi
            fi
       done
else
       # Nao é um diretório válido
       echo "O diretório informado não existe"
       exit 127
fi
Fundamentos de Programação Aplicada a Redes ­ 
Shell Script
Controle de Fluxo
                                       Frederico Madeira
                                     LPIC­1, LPIC­2, CCNA
                                     fred@madeira.eng.br
                                      www.madeira.eng.br

Shell Script - Controle de fluxo

  • 1.
    Fundamentos de Programação Aplicada a Redes ­  Shell Script Controle de Fluxo Frederico Madeira LPIC­1, LPIC­2, CCNA fred@madeira.eng.br www.madeira.eng.br
  • 2.
    Saída e Códigode Saída ✔ O comando utilizado para terminar um script é o exit ✔ Ele pode ser utilizado para retornar um valor ✔ Todo comando retorna um status ✔ Se finalizado com sucesso o exit code é 0 ✔ Se finalizado com falha, o exit code é um valor numérico diferente de zero #!/bin/bash echo “Teste exit code” Retornará 0 indicando que o comando foi ok. echo $? lskdf # Comando desconhecido Retornará um valor diferente de 0 indicando echo $? um erro exit 113 # Irá retornar 113 para o shell. Por convenção, os comandos retornam 0 para indicar sucesso ou retornam um valor diferente de zero para indicar um erro ou uma condição de erro
  • 3.
    Condicionais: TEST eIF Teste Condicional – IF if [ “$NOME” = “Fred” ] then echo “Seja bem vindo Fred” else echo “Acesso não Permitido” fi Teste Condicional – TEST test “CONDIÇÃO” && echo “Condição verdadeira” || echo “Condição falsa”
  • 4.
    Condicionais: TEST eIF Exemplo IF: #!/bin/bash echo -n "Digite seu primeiro nome: " read NOME if [ “$NOME” = “Fred” ] then echo “Seja bem vindo $NOME” else echo “Acesso não Permitido” exit 127 fi exit 0
  • 5.
    Condicionais: TEST eIF Exemplo TEST: #!/bin/bash echo “Verificação do sistema, devo prosseguir [s/n] ?” read RESPOSTA test “$RESPOSTA” = “n” && exit 2 echo "bla bla bla" exit 0
  • 6.
    Condicionais: TEST eIF Testes em arquivos Testes em variáveis -b é um dispositivo de bloco -c é um dispositivo de caractere Comparação Numérica -d é um diretório -lt é menor que (LessThan) -e o arquivo existe -gt é maior que (GreaterThan) -f é um arquivo normal -le é menor igual (LessEqual) -g o bit SGID está ativado -ge é maior igual (GreaterEqual) -G o grupo do arquivo é o do usuário atual -eq é igual (EQual) -k o sticky-bit está ativado -ne é diferente (NotEqual) -L o arquivo é um link simbólico -O o dono do arquivo é o usuário atual Comparação de Strings -p o arquivo é um named pipe “=” é igual -r o arquivo tem permissão de leitura != é diferente -s o tamanho do arquivo é maior que zero -n é não nula -S o arquivo é um socket -z é nula -t o descritor de arquivos N é um terminal -u o bit SUID está ativado Operadores Lógicos -w o arquivo tem permissão de escrita ! NÃO lógico (NOT) -x o arquivo tem permissão de execução -a E lógico (AND) -nt o arquivo é mais recente (NewerThan) -o OU lógico (OR) -ot o arquivo é mais antigo (OlderThan) -ef o arquivo é o mesmo (EqualFile)
  • 7.
    Condicionais: TEST eIF Prática: Script idade.sh Escreva um script que pergunte sua idade, pergunte seu sexo e seu nome de usuário neste sistema. Informar: - É maior de idade ? - Seu sexo é masculino ou feminino ? - Possui um diretório home neste servidor ? PS: Faça duas versões, uma usando if e outra usando test
  • 8.
    Condicionais: TEST eIF Resposta: Script idade.sh #!/bin/bash echo "------------------------------------------------------" if [ "$SEXO" = "M" ] echo -n "Qual sua idade ? " then read IDADE echo "Sexo Masculino" echo -n "Qual seu sexo [M/F]? " else read SEXO echo "Sexo Feminino" echo -n "Qual é seu nome de usuário ? " fi read USUARIO echo "------------------------------------------------------" if [ -d "/home/$USUARIO" ] echo"" then echo "Você possui o home: /home/$USUARIO" if [ $IDADE -ge 18 ] else then echo "Você nao possui um home neste sistema" echo "Você é MAIOR de idade"; fi else echo "Você é MENOR de idade"; exit 0 fi
  • 9.
    Condicionais: TEST eIF Resposta: Script idade.sh #!/bin/bash echo "------------------------------------------------------" echo -n "Qual sua idade ? " read IDADE echo -n "Qual seu sexo [M/F]? " read SEXO echo -n "Qual é seu nome de usuário ? " read USUARIO echo "------------------------------------------------------" echo"" test $IDADE -ge 18 && echo "Você é MAIOR de idade" || echo "Você é MENOR de idade" test "$SEXO" = "M" && echo "Sexo Masculino" || echo "Sexo Feminino" test -d "/home/$USUARIO" && echo "Você possui um home: /home/$USUARIO" || echo "Você não possui um home neste sistema" exit 0
  • 10.
    Condicionais: TEST eIF Prática: Script backup.sh Melhore o script backup.sh desenvolvido anteriormente e informe ao final uma mensagem informando se o backup foi concluído com sucesso e se o arquivo existe realmente no local indicado.
  • 11.
    Condicionais: TEST eIF Resposta: Script backup.sh #!/bin/bash OUT_DIR=/opt/backup/ HOSTNAME=$(hostname) AGORA=$(date +"%Y%m%d-%H%m") BKP_FILE="sysbkp_$HOSTNAME_$AGORA.tar.gz" DIRS="/etc /home /var/www/var/lib/mysql" if [ -e “$OUT_DIR/$BKP_FILE” ] then echo "Realizando backup do sistema...." echo “arquivo existe” cd $OUT_DIR else tar cvfz $BKP_FILE $DIRS echo “arquivo não existe” fi If [ “$?” != 0 ] then echo “Falha na execução do Backup” else echo “Backup executado com sucesso” fi
  • 12.
    Condicionais: CASE Permite acomparação de uma variável com muitos valores Sintaxe: case $VALOR in 1) echo “Você escolheu 1” ;; 2) echo “Você escolheu 2” ;; *) echo “Você não escolheu nem 1 e nem 2” ;; esac
  • 13.
    Condicionais: CASE Exemplo:: #!/bin/bash echo "" echo"Escolha uma das seguintes pessoas" echo "" echo "--------------------------------" echo "1. Frederico Madeira" echo "2. Alberto Viegas" echo "3. Luciano Cabral" echo "" echo -n "Qual deles vocÊ deseja obter iformações: " read ESCOLHA Continua ->
  • 14.
    Condicionais: CASE Exemplo:: case $ESCOLHAin 1) echo "" echo "Professor das cadeiras de Linux/Shell/SD e VoIP" echo "Email: fred@madeira.eng.br" ;; 2) echo "" echo "Professor das cadeiras de Linux/Shell/SD e Segurança" echo "Email: alviegas@gmail.com" ;; 3) echo "" echo "Professor das cadeiras de Windows/Redes Ethernet" echo "Email: lscabral@gmail.com" ;; *) echo "" echo "Qualquer outra opção cai aqui" ;; esac
  • 15.
    Condicionais: CASE Script: sysinfo2.sh Crieum script que exiba informações sobre o sistema. Ele deve ter a seguinte interface: 1) Espaço livre nos discos 2) Status da Memória do sistema 3) Informações sobre o Processador 4) Endereço IP 5) Quem está logado no sistema ENTRE COM A OPÇÃO DESEJADA:
  • 16.
    Condicionais: CASE Script sysinfo2.sh #!/bin/bash #Exibição do Menu echo "1) Espaço Livre nos Discos" echo "2) Status da Memória do Sistema" echo "3) Informações sobre o Processador" echo "4) Endereço IP" echo "5) Quem está logado no sistema" echo "" echo -n "Escolha a opção: " # Leitura da opção do usuário read OPCAO Continua ->
  • 17.
    Condicionais: CASE Script sysinfo2.sh #Trata a opção escolhida pelo usuário case $OPCAO in 1) df -h ;; 2) free ;; 3) cat /proc/cpuinfo ;; 4) /sbin/ifconfig ;; 5) w ;; *) echo "Não foi escolhida uma opção válida" ;; esac
  • 18.
    LOOPS: for Loop éum bloco de código que se repete para enquanto uma condição for verdadeira. Sintaxe: for arg in [list] do Comando 1 Comando 2 Comando 3 .... done
  • 19.
    LOOPS: for Exmplo #!/bin/bash # Fazendoum loop dada uma sequência numérica for NUMBER in 1 2 3 4 5 6 7 8 9 10 do echo "O número é: $NUMBER" done
  • 20.
    LOOPS: for Exmplo #!/bin/bash # Fazendoum loop através de variáveis ARQUIVOS="/ect/passwd /etc/crontab /etc/sysconfig/network /etc/fakefile /opt/sportclube /usr/sbin/shutdown" for LISTA in $ARQUIVOS do echo "O arquivo é: $LISTA" done
  • 21.
    LOOPS: for Exmplo #!/bin/bash # Fazendoum loop através de variáveis carregadas dinamicamente echo -n "Informe um diretório: " read DIR LISTA=$(ls $DIR) for ARQ in $LISTA do echo "O arquivo é: $ARQ" done
  • 22.
    LOOPS: for Script: file_exist.sh Façaum script que verifique se a lista de arquivos abaixo existe e informe ao usuário. /ect/passwd /etc/crontab /etc/sysconfig/network /etc/fakefile /opt/sportclube /usr/sbin/shutdown
  • 23.
    LOOPS: for Script: file_exist.sh #!/bin/bash ARQUIVOS="/ect/passwd /etc/crontab /etc/sysconfig/network /etc/fakefile /opt/sportclube /usr/sbin/shutdown" forLISTA in $ARQUIVOS do if [ -e "$LISTA" ] then echo "$LISTA existe" else echo "$LISTA não existe" fi done
  • 24.
    LOOPS: for Script: ping_hosts.sh Salvea lista abaixo no arquivo hosts.lst e envie 1 pacote ICMP para cada um, ao final informe se o host está ativo ou não. Ordene os hosts em ordem alfabética antes de começar a executar os pings. Www.madeira.eng.br Www.uol.com.br Www.linux.com Www.fedoraproject.og Www.terra.com.br www.jc.com.br Dica: Faça verificação do exit code de cada comando ping
  • 25.
    LOOPS: for Script: file_exist.sh #!/bin/bash LISTA=$(sorthosts.lst) for HOST in $LISTA do ping -c 1 $HOST &> /dev/null && echo "Host $HOST está ativo" || echo "HOST $HOST está offline" done
  • 26.
    LOOPS: for Script: new_ls.sh Escrevaum script que solicite ao usuário um diretório, informe para cada objeto encontrado neste diretório: - se ele é um diretório - Se é um arquivo - Se é um link, - Se for arquivo, informe se seu tamanho é maior do que zero. O diretório pode ser informado como parâmetro para o comando ou de forma interativa para o usuário Valide se o diretório informado existe ou não Dicas: $* - Lista dos Argumentos passados $# - Quantidade de argumentos passados $1 - Primeiro Argumento $2 – Segundo Argumento
  • 27.
    LOOPS: for Script: new_ls.sh #!/bin/bash if[ -z "$1" ] then # entra aqui se não for passado parâmetro echo -n "Insira o diretório desejado: " read DIR else # entra aqui se for passada algum parametro DIR=$1 fi
  • 28.
    LOOPS: for if [-d "$DIR" ] then # Se for um diretório váldio, executa LISTA=$(ls $DIR) for ARG in $LISTA do if [ -d "$DIR/$ARG" ] then echo "$ARG - Diretório" else if [ -L "$DIR/$ARG" ] then echo "$ARG - Link" else if [ -e "$DIR/$ARG" ] then echo -n "$ARG - Arquivo - " if [ -f "$DIR/$ARG" ] then echo "Arquivo maior do que zero" else echo "Arquivo zerado" fi fi fi fi done else # Nao é um diretório válido echo "O diretório informado não existe" exit 127 fi
  • 29.
    Fundamentos de Programação Aplicada a Redes ­  Shell Script Controle de Fluxo Frederico Madeira LPIC­1, LPIC­2, CCNA fred@madeira.eng.br www.madeira.eng.br