Linux tomada de decisões

Linux shell script tomar decisoes: if then else elif fi case – Exemplos Práticos

Shell script nome dado a um arquivo que será interpretado por algum programa tipo Shell. Atualmente existem vários programas tipo Shell, além dos principais sh e bash, existem também, ksh, zsh, csh e tcsh. Um Shell script ou script em Shell necessita basicamente do interpretador (Shell). Algumas operações típicas executadas por linguagens de script em Shell incluem; manipulação de arquivos, execução de programas e impressão de texto. Sendo assim é muito comum ver scripts sendo utilizados para automatização de tarefas, como configurar o ambiente, executar um programa e fazer qualquer limpeza, registro, etc.
– wiki

Para declarar que o script deve ser interpretado por Bourne-Again shell (Bash) é recomendável a utilização do comando env, pelo fato que apesar de o Bash já vir instalado em muitas distribuições Linux, não sabemos se ele estará em todas elas no mesmo diretório /bin/, então use a seguinte forma:

#!/usr/bin/env bash

– wiki

Os comentários nas linguagens Bourne Shell (sh) e Bourne-Again Shell (bash) serão utilizados hashtag (#), Exemplo de comentários:

#Comentário
#- Segundo comentário
# // [ Terceiro comentário ] //

– wiki

Variáveis – Como qualquer outra linguagem de programação conhecida, um script em Shell também possui suporte a variáveis. Em uma breve explicação uma variável é um nome/objeto simbólico ao qual podemos atribuir valores, ler ou manipular o conteúdo.

– wiki

Os scripts em Shell possuem as seguintes variáveis pré-definidas:

$? – Armazena o status de saída do último programa executado;
$# – Armazena a quantidade de parâmetros de linha de comandos;
$$ – Armazena o valor PID (Process Identifier) do script em shell que estiver em execução;
$@ – Armazena o valor de todos os parâmetros passados, similar a variável argv presente nas linguagens de programação C e C++;
$! – Armazena o PID do último processo em segundo plano. Isso é útil para acompanhar o processo à medida que o trabalho é realizado;
$0, …, $9 – Armazena os valores de todos os parâmetros de linha de comando separadamente.

– wiki

Variáveis globais ou variáveis de ambiente globais, são variáveis criadas/definidas com o comando export e podem ser utilizadas por multiplos scripts em Shell. Um exemplo é a variável de ambiente LANG (Pré-definida em diversas distribuições Linux), Podendo ser acessada por diversos arquivos de script em Shell.

Outras variáveis pré definidas são:

PATH: define diretórios de procura por programas executados no shell;
USER: informa o nome do usuário do shell;
HOME: informa o caminho do diretório home do usuário;
LANG: Idioma/Linguagem, especificada como locale;
PWD: diretório atual;
TERM: Tipo de terminal atual em uso.
UID: UID do usuário atual.
RANDOM: Gera um número aleatório

– wiki

A duas formas de criar uma variável global, exportar uma variável pré definida ou definir quando for exportar:

VARIAVEL1=Teste
export VARIAVEL1
# Define e exporta com export
export VARIAVEL2=Teste

Array – Bourne Shell (sh) não é compatível com variáveis tipo array, mas Bourne-Again Shell (Bash) sim, exemplo simples de implementação:

#!/usr/bin/env bash
meu_array=(1 2 3 4 5 6 7 8 9)
meu_Array=(“abc” “def” “ghi”)

Chamar variáveis – Para chamar variáveis utiliza-se o sinal de cifrão $var. O cifrão ($) também é bastante utilizado em script sh, para executar programas externos exemplo: var=$(expr 2 + 2) irá armazenar a saída do programa expr. E o cifrão mais chave ${var} é comum ser utilizado das seguintes maneiras:

Para acessar posições em um array ${var[1]}. (obs.: não funciona para sh, apenas para Bash)

E também para substituir o valor de uma variável se a mesma não possuir um valor: ${var:-nome} – ${var:=nome} – ${var:-$(programa)} dessas maneiras irão substituir pelo que for passado depois de :- ou :=, exemplo em código:

read -p “Digite um nome: “myname
echo “${myname:=$(whoami)}”
O código acima irá pedir para o usuário digitar um nome, caso digite irá utilizar echo para imprimir o nome digitado na saída padrão, caso contrário irá substituir pela saída do comando whoami, ao invés de substituir pela saída de um comando, você pode substituir por outro valor exemplo: ${myname:=Bourne Shell}.

– wiki

Tomada de Decisões – Em toda linguagem de programação existe alguma estrutura para tomada de decisões. Essa estrutura em geral é feita através do comando “if”. O comando “if” analisa de uma expressão é verdadeira e então executa um bloco de código, caso a expressão seja falsa pode ser executado, ou não, um outro bloco. Em geral as linguagens de programação oferecem maneiras de verificar se um valor é igual, menor ou maior que outro. As formas mais comuns abaixo.

Para remover uma variável, utiliza-se o comando unset + nome da variável, você pode também remover múltiplas variáveis basta separá-las por espaços.

unset VAR
unset VAR1 VAR2 VAR3 VAR4

Declaração if para scripts em bash ou sh:

if [ $1 = $2 ]; then
echo “Parametro 1=$1 é igual a 2=$2.”
fi
Existe também outra forma:

[ $1 = $2 ] && { echo “Parametro 1 ($1) é igual a 2 ($2).”; exit 0; }

Declaração if else para scripts em bash ou sh, há diversas formas diferentes, tenha cuidado para não esquecer os espaços entre os colchetes eles são muito importantes:

A declaração if else mais comum e mais utilizada é a seguinte:

if [ $1 = $2 ]; then
echo “Parametro 1 ($1) é igual a 2 ($2).”
else
echo “Parametro 1 ($1) não é igual a 2 ($2).”
fi
Mas, existe uma abreviação que também é muito utilizada que é menor e muito boa para teste de linha única:

[ $1 = $2 ] && { echo “Parametro 1 ($1) é igual a 2 ($2).”; exit 0; } || { echo “Parametro 1 ($1) é diferente de 2 ($2).”; exit 0; }

Declaração else if para scripts em bash ou sh são diferentes de algumas linguagens de programação, exemplo:

if [ $3 ]; then
echo “$3”
elif [ $2 ]; then
echo “$2”
else
echo “$1”
fi

Case – Scripts em Bash ou sh, permitem case, a sintaxe é a seguinte:

case “$var” in
valor)
;;
esac

Scripts em Bash possui compatibilidade com Expressões Regulares, algo que scripts em Bourne Shell (sh) não reconhecem:

#!/usr/bin/env bash
[[ $1 =~ ^sh|SH$ ]] && { echo “$1 – Bourne Shell”; }

– wiki

EXEMPLOS PRÁTICOS PRATICADOS

Me acompanhe neste caminho simples.

Existem diversos operadores para cada Shell script, mas aqui serão passadas informações especificamente sobre Bourne shell por ser mais comum e muitos outros shell são similares.

PARA TRATAR NÚMEROS:

== : Igual à
!= : Diferente de
< : Menor que
> : Maior que
<= : Menor ou igual à
>= : Maior ou igual à

EM SHELL SCRIPT OS MESMOS TESTES SÃO OBTIDOS COM:

-eq : (equal) Igual à
-ne : (not equal) Diferente de
-lt : (less than) Menor que
-gt : (greater than) Maior que
-le : (less or egual) Menor ou igual à
-ge : (greater or equal) Maior ou igual à

O USO DO “IF” EM SHELL SCRIPT:

#!/usr/bin/env bash

# titulo: jamais.sh

if [ 4 -eq 6 ] # se 4 for igual a 6
then # então
echo “Esse echo jamais acontecerá” # comando 1
fi # fechamento obrigatório do if

# fim do script

É necessário manter espaços entre os colchetes e os números, ou variáveis. O bloco após a palavra “then” será executado se a expressão dentro do “if” for verdadeira. O bloco “if” termina com a palavra “fi” que é “if” ao contrário. Essa é uma maneira simples de identificar o final de um “if” quando o encontramos.

PARA FAZER COMPARAÇÕES COM TEXTOS USE:

= : Igual à (isso mesmo apenas um sinal de igual)
!= : Diferente de
-n : String existe e não é vazia (apenas um operador)
**-z** : String existe e é vazia (apenas um operador)

Esemplo, o “if” verifica se a variável $nome existe e está vazia, isso significa que o usuário não digitou o nome dele. A instrução “read” faz com que o shell leia alguma informação via teclado e retorne essa informação para a variável informada. Foi usada a palavra “else” que significa “senão”. Esse bloco é executado quando o “if” retorna um valor falso:

#!/usr/bin/env bash

# titulo: seu_nome.sh

# —————- #

echo “Digite seu nome: ” # comando echo
read NOME # comando read armazena o que digitou em NOME

# —————- #

if [ -z $NOME ] # se é apenas um operador
then # então
echo “Você não digitou seu nome!” # comando 1
else # se não
echo “Olá, $NOME” # comando 2
fi # fechamento obrigatório do if

# —————- #

# fim do script

O shell oferece mais opções para o “if” do que as linguagens de programação o fazem! Veja outras opções bem interessantes:

**-s ** : Arquivo existe, não vazio (apenas um operador)
**-f ** : Arquivo existe, não é um diretório (apenas um operador)
**-d ** : Diretório existe (apenas um operador)
**-w ** : Arquivo, com permissão de escrita (apenas um operador)
-r : Arquivo, com permissão de leitura (apenas um operador)
**-x ** : Arquivo, com parmissão de execução -x (apenas um operador)

Por exemplo, crio um diretório TESTES e nele um arquivo de texto vazio chamado meu_log_test.txt, dou permissão de execução e executo o script log_test.sh abaixo:

#!/usr/bin/env bash

# titulo: log_test.sh

ARQUIVO=”/home/user/TESTES/meu_log_test.txt”

if [ -f “$ARQUIVO” ] # se o aquivo meu_log_test.txt existir
then # então
echo “Continuando log…” >> “$ARQUIVO” # comando 1
else # se não
echo “Criando log…” > “$ARQUIVO” # comando 2
fi # fechamento obrigatório do if é fi

# fim do script

Executo e confiro o texto meu_log_test.txt. Resultado:

TESTES:$ ./log_test.sh
TESTES:$ cat meu_log_test.txt
Continuando log…
TESTES:$

Então fica assim, se o arquivo existir continue registrando, execute determinado comando, escreva “Continuando log…”. Se não existir crie o arquivo e escreva nele “Criando log…”.

Apague o arquivo meu_log_test.txt execute o script e veja o script funcionando.

Agora este script super simples, se executado com outros comandos pode fazer coisas bem úteis. O script que toma decisões é forte e útil.

IFs Aninhados – Chamamos de “ifs aninhados” as construções onde há um “if” dentro do bloco “then” ou “else” de outro “if”:

#!/usr/bin/env bash

# titulo: ifs_aninhados_test.sh

# ————– #

# primeiro read

echo “Digite seu nome: ”
read NOME

# ————– #

# segundo read

echo “Digite sua idade: ”
read IDADE

# ————– #

# ifs aninhados

if [ -z $NOME ]
then
echo “Você não digitou seu nome.”
else
echo “Seu nome é $NOME”
if [ $IDADE -gt 10 ] # se sua idade for mais que 10
then # então
echo “Você tem mais que 10 anos.”
else # se não
echo “Você tem 10 anos ou menos.”
fi # fechamento obrigatório do if
fi # fechamento obrigatório do else?

# ————– #

# fim do script

Resultado:

~:$ ifs_aninhados_test.sh
Digite seu nome:
Pipopi
Digite sua idade:
55
Seu nome é Pipopi
Você tem mais que 10 anos.
~:$

Entendendo o funcionamento deste script permite criar vários semelhantes a ele que podem ser usados de acordo com sua necessidade no teu dia a dia para executar tarefas rotineiras (ou não). Não importa se você tem 18, 20, 30 anos ou mais; saiba que este exemplo é recomanedado para todas as idades. Cada idade usará de uma maneira diferente? Provavelmente sim.

If MULTINÍVEL – PODE FAZER COMPARAÇÕES EM SEQUÊNCIA, COM O USO DO elif

#!/usr/bin/env bash

# titulo: if_elif_test.sh

# ————– #

echo “Digite um número”
read NUMERO

# ————– #

if [ $NUMERO -gt 0 ];
then
echo “Número positivo”

# ————– #

elif [ $NUMERO -lt 0 ]
then
echo “Número negativo”

# ————– #

elif [ $NUMERO -eq 0 ]
then
echo “Número é zero”

# ————– #

else
echo “O valor fornecido não é um número!”
fi

# fim do script

Resultado:

~:$ if_elif_test.sh
Digite um número
12
Número positivo
~:$

O SHELL OFERECE OPÇÕES COMO “case” PARA CONTROLE DE FLUXO. O comando “case” é usado para executar um bloco de código de acordo com o valor de uma variável. O comando “case” é interessante pois pode definir diversas opções diferentes sem usar uma estrutura com diversos comandos “if”, “elif” e “else”. O exibe uma mensagem e então pede uma informação do usuário. O usuário vai digitar alguma letra e então o comando “case” entra em ação. Ele verifica qual valor foi digitado pelo usuário e executa os blocos de código relativos a cada opção. Primeira opção é a padrão, por isso ela é executada mesmo que o usuário não digite um valor.Cada bloco do case é iniciado por um valor que a variável analisada pode ter, ou vários valores, separados por um pipe. Os blocos são finalizados por uma sequência de dois caracteres ‘ponto-e-vírgula’ (;;).

#!/usr/bin/env bash

# titulo: echo_read_case_esac_test.sh

echo -n “O que deseja fazer? (L)listar/(C)opiar texto/(S)air do script? [A] ”
read resposta

case “$resposta” in
l|L|””)
echo “Listando…”
sleep 3
ls -ltA
;;
c|C)
echo “Copiando arquivos .txt para Documentos”
sleep 3
cp -r *.txt ~/Documentos/
;;
s|S)
echo “Saindo…”
;;
*)
echo “Opção inválida”
;;
esac

Resultado exemplo:

~:$ echo_read_case_esac_test.sh
O que deseja fazer? (L)listar/(C)opiar texto/(S)air do script? [A] W
Opção inválida

Meu caro (a)

.

A maior parte dessa gente vai te enganar o tempo todo.

Só pensam em dinheiro.

A decência e dignidade são distribuídas as pessoas em doses desiguais.

Pare um minuto.

Eu te digo.

Pare um minuto.

Movendo-se tão rapidamente para o outro lado desta festa, minha observação perde-se ao luar.

Minhas especulações tem base.

Vale a pena.

Acho que as coisas sempre foram horríveis.

Todo mundo acha isto, pelo menos as pessoas mais perspicazes.

E eu sei que estão certas.

Já estive em toda parte, já vi de tudo e já fiz de tudo.

Muitos acreditam nisto.

Viver, ver, fazer tudo em toda parte.

Porém não é verdade.

Mas também não desbanca a certeza do horror.

Ninguém é capaz de estar em toda parte, ver de tudo e fazer de tudo.

A carne não aguenta e a mente não suporta.

Algumas pessoas em certas situações deveriam abandonar tudo e fugir.

Poucos escapam, ou quando tentam, é tarde demais.

Há tantas coisas extraordinárias na vida de uma pessoa.

1
A solidão da primeira infância.

2
O exagero de sentimentos sexuais da adolescência, início da idade adulta.

3
A verdadeira certeza que vem na meia-idade de que o mundo não gosta de você e que está constantemente tentando te derrubar.

4
A benção da ausência ou perda constante e progressiva da memória que vem na velhice.

5
A sensatez e a integridade da morte que poupa os seres de coisas insuportáveis.

Somos meros animais nascidos em meio a dores, destinados a morrer.

Temos a Guerra. Todo dia guerras em todos os níveis de alto a baixo. Por dentro e por fora. Guerras dentro de guerras.

A sua descoberta acontece cedo em nós, mas quase nunca guardarmos lembrança disso.

É claro que crianças expostas cedo ao seu aperto mais grosseiro, nunca esquecem essa lição.

Mas aí é mais uma visita indesejada dos pesadelos que entopem a noite, do que guerra propriamente dita.

Aí é da mesma natureza que o crime, uma agressão incompreendida durante a infância, suscitando só medo e trauma.

A verdadeira guerra não é isso.

Não é o confronto de anjos com os demônios.

A guerra é uma coisa dos seres humanos.

De tal forma é um assunto das pessoas que parece difícil aceitar que esteja ausente do paraíso.

É uma coisa que vem de dentro, é um jogo a sério que usa a glória como engodo, apesar de ser mortal que chegue para que não haja possibilidade de retorno ao ponto de partida.

Pode voltar-se em corpo, mas volta-se outro.

A guerra surge da nossa alma onde o inconsciente esperneia e se contorce. Lá ela é construída.

Ela que precede a imaginação e a inteligência, a guerra que possibilita a destreza física e incorpora o conhecimento sensorial da natureza, a que anima a coragem e a vontade de vencer, e a que clama por justiça e busca a honra.

O brandir das armas é apenas vento, um turbilhão que se agita na superfície, resultado da guerra que ja revolucionou a mente, permitindo o delírio rancoroso que veste no outro a farda do horror quando está em perigo a nossa família, o nosso sonho ou a nossa vida.

E a nossa vida está quase sempre em perigo.

A guerra que nos distingue dos animais.

A guerra funda a humanidade.

Antes que parta, gostaria de dizer que tens um desses raros sorrisos que trazem em si algo de segurança e de conforto; um desses sorrisos que encontrei umas quatro ou cinco vezes em toda a vida.

Um sorriso que parece encarar todo o mundo, a eternidade, e então se concentra sobre mim, transmitindo-me uma simpatia irresistível.

Um sorriso que me compreende até o ponto em que quero ser compreendido, acredita em mim como eu gostaria de acreditar em mim mesmo e me garante que tem de mim a impressão mais favorável que eu teria a esperança de comunicar.

Um sorriso Gatsby de alguém que sabe escutar as pessoas.

Por isto, obrigada(o) bom divertimento e até breve pois vou caminhar por aí.

Uma perfeita, precisa lua cheia forte brilha até onde a vista alcança então aproveite bem a festa, pois a noite é uma criança.

.