Programacao do Shell: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(6 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 32: Linha 32:
===Variáveis e argumentos===
===Variáveis e argumentos===


;Variáveis internas do Shell: O Shell possui várias '''variáveis internas''', como por exemplo $USER, $HOME, $SHELL, $PATH, etc.
;Variáveis internas do Shell: O Shell possui várias '''variáveis internas''', como por exemplo $USER, $HOME, $SHELL, $PATH, $PWD,etc.
:Uma lista das variáveis internas do Shell pode ser obtida com o comando:
:Uma lista das variáveis internas do Shell pode ser obtida com o comando:
  printenv
  printenv
Linha 81: Linha 81:


;Variáveis cujo valor é requisitado ao usuário pelo script: Como qualquer linguagem de programação o usuário pode ser solicitado a fornecer um valor, o qual será lido pela função '''read''' e armazenado em uma variável.
;Variáveis cujo valor é requisitado ao usuário pelo script: Como qualquer linguagem de programação o usuário pode ser solicitado a fornecer um valor, o qual será lido pela função '''read''' e armazenado em uma variável.
:Exemplo:
:Exemplo:
  #!/bin/bash
  #!/bin/bash
  #Este script requisita que o usuário digite um valor
  #Este script requisita que o usuário digite um valor
Linha 160: Linha 160:
  done
  done


==Exercícios==
==Tarefa==
#Faça um script que liste o nome do usuário logado e imprima o seu diretório home.
#Faça um script que liste o nome do usuário logado e imprima o seu diretório home.
#Faça um script que imprima a data no formato 04Nov2015 e imprima na sequência o conteúdo do diretório home.
#Faça um script que imprima a data no formato 04Nov2015 e imprima na sequência o conteúdo do diretório home.
#Faça um script que verifique se um usuário passado como parâmetro existe (sugestão: comando '''getent''').
#Faça um script que verifique se um usuário passado como parâmetro existe (sugestão: comando '''getent''': https://en.wikipedia.org/wiki/Getent).
#Faça um script que verifique se um grupo passado como parâmetro existe (sugestão: comando '''getent''').
#Faça um script que verifique se um grupo passado como parâmetro existe (sugestão: comando '''getent''').
#Faça um script que liste os membros de um grupo primário passado como parâmetro.
#Faça um script que liste os membros de um grupo primário passado como parâmetro.

Edição atual tal como às 16h36min de 19 de abril de 2021

Programação do Shell

A programação do Shell permite que o administrador crie pequenos programas para automatizar a administração do sistema, como por exemplo, uma sequência de comandos para realizar backup de dados.

Um programa Shell, ou script shell, é criado em um arquivo de texto contendo comandos do Linux, e pode incluir variáveis, realização de testes, laços de repetição, comentários, etc.

Um programa Shell é interpretado linha a linha pelo Shell, portanto, não é um programa a ser compilado [1].

Comandos básicos

Um script shell inicia com a definição de qual será o Shell interpretador do comando, por exemplo:

#!/bin/bash

Dentro do programa um comentário inicia com o caractere #, com exceção da linha de definição do Shell interpretador.

Exemplo de script que imprime uma frase [1]:

#!/bin/bash
#Este script imprime uma frase
echo "Alo $USER, bom dia!"
No exemplo é utilizada a variável $USER que retorna o nome do usuário.

O script deve ser salvo em um arquivo com a extensão .sh (exemplo: alo.sh) e deve ter permissão de execução:

chmod +x alo.sh

Para executá-lo, chamar pelo nome do arquivo, por exemplo:

./alo.sh

Variáveis e argumentos

Variáveis internas do Shell
O Shell possui várias variáveis internas, como por exemplo $USER, $HOME, $SHELL, $PATH, $PWD,etc.
Uma lista das variáveis internas do Shell pode ser obtida com o comando:
printenv
Variáveis definidas pelo usuário
O usuário pode definir variáveis dentro de um script e associar valores a elas, por exemplo:
var="valor"
O valor pode ser uma frase, numero, comando ou outra variável.
Não pode haver espaços entre a variável e o valor.
O valor pode ser expressado entre as aspas (“ ”), apóstrofos (' ') ou crases (` `):
  • aspas (“ ”): interpretam as variáveis que estiverem dentro do valor;
  • apóstrofos (' '): leem os valores literalmente, sem interpretar nada;
  • crases (` `): interpretam um comando e retornar a sua saída para a variável.

Exemplos [2]:

var="Eu sou o usuário $USER"
echo $var

Eu sou o usuário evandro
var='Eu sou o usuário $USER'
echo $var

Eu sou o usuário $USER
var="Meu diretório atual é o `pwd`"
echo $var

Meu diretório atual é o /home/evandro
Variáveis passadas como argumentos
Um script pode manipular variáveis que recebem valor de argumentos passados quando o script é chamado.
Internamente ao script, as seguintes variáveis são utilizadas:
  • '$0' retorna o nome do script;
  • '$1 a $9' retorna valor dos argumentos passados na chamada do script;
  • '$#' retorna o número de argumentos;
  • '$*' retorna todos os argumentos.

Exemplo:

#!/bin/bash
#Este script verifica se há dois argumentos
#e realiza a soma dos mesmos
if [ $# -eq 2 ]
then
  soma=`expr $1 + $2`
  echo "Soma = $soma" 
else
  echo "Usar 2 argumentos"
fi
Variáveis cujo valor é requisitado ao usuário pelo script
Como qualquer linguagem de programação o usuário pode ser solicitado a fornecer um valor, o qual será lido pela função read e armazenado em uma variável.
Exemplo:
#!/bin/bash
#Este script requisita que o usuário digite um valor
echo -n "Por favor, digite seu nome: "
read nome
echo "Seu nome é $nome"
Variável $?
Retorna o status do último comando executado:
  • 0 em caso de sucesso
  • un número diferente de zero caso contrário.
Exemplo:
true
echo $?
0
false
echo $?
1

Estruturas de controle

if
Implementa o clássico se-então-senão.

Exemplos:

#!/bin/bash
if [ $HOME = `pwd` ]
then
  echo "Você está no diretório home."
else
  echo "Você não está no diretório home"
fi

Veja a seguir os parâmetros mais comuns utilizados com o comando teste [3]:

  • n string1: o comprimento de string1 é diferente de 0;
  • z string1: o comprimento de string1 é zero;
  • string1 = string2: string1 e string2 são idênticas;
  • string1 != string2: string1 e string2 são diferentes;
  • inteiro1 -eq inteiro2: inteiro1 possui o mesmo valor que inteiro2;
  • inteiro1 -ne inteiro2: inteiro1 não possui o mesmo valor que inteiro2;
  • inteiro1 -gt inteiro2: inteiro1 é maior que inteiro2;
  • inteiro1 -ge inteiro2: inteiro1 é maior ou igual a inteiro2;
  • inteiro1 -lt inteiro2: inteiro1 é menor que inteiro2;
  • inteiro1 -le inteiro2: inteiro1 é menor ou igual a inteiro2;
  • e nome_do_arquivo: verifica se nome_do_arquivo existe;
  • d nome_do_arquivo: verifica se nome_do_arquivo é um diretório;
  • f nome_do_arquivo: verifica se nome_do_arquivo é um arquivo regular (texto, imagem, programa, docs, planilhas).
case
Implementa um se múltiplo.

Exemplo:

#!/bin/bash
echo -n "Digite um número: "
read num
case $num in
 1)
    echo "Número 1";
 ;;
 2)
    echo "Número 2";
 ;;
 *)
    echo "Não é número 1 nem 2";
 ;;
esac
while e for
[4]
#!/bin/bash
i=1;
while [ $i -le 10 ] ; do 
  echo $i
  i=`expr $i + 1 `;
done
#!/bin/bash
for i in $( seq 10 ) ; do
  echo $i;
done

Tarefa

  1. Faça um script que liste o nome do usuário logado e imprima o seu diretório home.
  2. Faça um script que imprima a data no formato 04Nov2015 e imprima na sequência o conteúdo do diretório home.
  3. Faça um script que verifique se um usuário passado como parâmetro existe (sugestão: comando getent: https://en.wikipedia.org/wiki/Getent).
  4. Faça um script que verifique se um grupo passado como parâmetro existe (sugestão: comando getent).
  5. Faça um script que liste os membros de um grupo primário passado como parâmetro.
  6. Faça um script que liste os membros de um grupo secundário passado como parâmetro.


Referências


usuário

--Evandro.cantu (discussão) 10h23min de 4 de novembro de 2015 (BRST)