Shell Script PARTE 2 Funções Assim como em qualquer "linguagem de programação" o shell script proporciona a utilização de funções. Sintaxe: nome_funcao () { funcao_2;; } nome_funcao_2 () { acao } nome_funcao Funções Onde: nome_funcao – Funcão criada. acao – Ação a ser tomada. nome_funcao_2;; - Chamada da função nome_funcao_2. nome_funcao – Função que dará inico ao shell script. Será criado um shell script para no qual é possível escolher se será feito uma tabuada do 2 ou do 3 sendo que cada uma é feita por uma função. Funções #!/bin/bash principal() { escolha=-1 while [ $escolha -ne 0 ]; do echo "Escolha uma opção" echo "1- Fazer tabuada do 2"; echo "2- Fazer tabuada do 3"; echo "0- Sair"; echo -n ":"; read escolha; if [ "$escolha" -eq "1" ]; then gerarTabuada2 elif [ "$escolha" -eq "2" ]; then gerarTabuada3 fi done } Funções gerarTabuada3() { for i in {1..10}; do echo "$i*3="$i*3 done } gerarTabuada2() { for i in {1..10}; do echo "$i*2="$i*2 done } principal PASSANDO ARGUMENTOS PARA AS FUNÇÕES Como, depois de declaradas, podemos usar as funções assim como usamos os comandos, também podemos passar argumentos para funções, assim como fazemos com os comandos. Os argumentos são armazenados da mesma forma que os parâmetros, quando usamos comandos. Ou seja, o nome do script é armazenado na variável '$0', o 1º argumento fica na variável '$1', o 2º na '$2', ... O número total de argumentos na '$#' e todos são armazenados na '$@'. PASSANDO ARGUMENTOS PARA AS FUNÇÕES #!/bin/sh args() { echo "Nome: $0" echo "Total: $#" echo "Primeiro: $1" echo "Segundo: $2" echo "Terceiro: $3" echo echo "Todos: $@" echo } args arg1 arg2 arg3 CÓDIGOS DE RETORNO (RETURN CODES) Como vimos, todo e qualquer comando do Unix retorna algum código. '0' caso tenha dado tudo certo e outro número para mostrar que houve um erro, onde números diferentes são usados para indicar erros diferentes. O bash armazena o código de retorno do último comando na variável '$?'. Por exemplo, digite no terminal: $ comando_inexistente $ echo $? Que exibirá o erro, pro caso do comando não existir. Agora, teste um comando que funcione bem: $ ls $ echo $? RETURN Como estes códigos de saída são amplamente usados no *Unix, é uma boa prática fazer o mesmo em seus scripts. Usa-se o comando return [|inteiro], ao invés de exit [|inteiro]nas funções de seu script, pois queremos somente que a função termine, não o script, e retornando um inteiro para o script, fazendo uma comunicação deste com a função. Se não usarmos um return em uma função, o '$?' armazenará o código de retorno do último comando da função. Podemos escrever só 'return' sem retornarmos explicitamente um número. Quando a função encontra 'return' ela termina imediatamente (não executa o que vem em seguida) e '$?' armazenará o código de retorno do último comando antes de encontrar da função chegar em 'return'. Ou retornamos algo específico de nosso propósito. Dentro de condicionais, por exemplo: RETURN if(tudo certo) return 2112 else return 666 VARIÁVEIS GLOBAIS * Aqui vai uma pequena e importante ressalva, para você que já vem de outra linguagem de programação: Por padrão, as variáveis em Shell são globais. Se desejar ter uma variável local em suas funções, as declare como 'local'. Exemplo: local VAR='Existem variáveis locais! Sem isso, as variáveis que você cria dentro das função estarão disponíveis por todo o script, ou caso já existam serão sobrescritas. Portanto, cuidado, dê nomes únicos para as suas variáveis ou adicione o local na frente. Variáveis em vetores O shell permite o uso de variáveis em forma de array. Ou seja, vários valores podem ser guardados em uma variável seguindo a ordem de uma indexação. Assim como não é necessário declarar o tipo de variável no início do programa, também não é preciso declarar que uma variável será usada como vetor Um array é criado automaticamente se for atribuído um valor em uma variável da seguinte forma: nomevar[indice]=valor, onde índice é um número maior ou igual a zero. Exemplo: camada[0]=Física camada[1]=Enlace camada[2]=Redes Variáveis em vetores Outra forma de se atribuir valores em array é: nomevar=(valor1, valor2, ..., valorn). Variáveis do sistema Existem algumas variáveis que são próprias do sistema e outras que são inicializadas diretamente pelo shell. Algumas dessas variáveis, denominadas variáveis do shell são explicadas abaixo: ◦ HOME - Contém o diretório home do usuário. ◦ LOGNAME - Contém o nome do usuário atual. ◦ IFS - Contém o separador de campos ou argumento (Internal Field Separator ). Geralmente, o IFS é um espaço, tab, ou nova linha. Mas é possível mudar para outro tipo de separador. ◦ PATH - Armazena uma lista de diretórios onde o shell procurará pelo comando digitado. ◦ PWD - Contém o diretório corrente. Variáveis do sistema ◦ PS1 - Esta é denominada Primary Prompting String. ◦ Ou seja, ela é a string que está no prompt que vemos no shell. Geralmente a string utilizada é: • \s O nome do shell. • \u Nome do usuário que está usando o shell. • \h O hostname • \w Contém o nome do diretório corrente desde a raiz. • \d Mostra a data no formato: dia_da_semana mês dia. • \nnn Mostra o caracter correspondente em números na base octal. • \t Mostra a hora atual no formato de 24 horas, HH:MM:SS. • \T Mostra a hora atual no formato de 12 horas, HH:MM:SS Variáveis do sistema PS2 - Esta é denominada Secondary Prompting String. Ela armazena a string do prompt secundário. O padrão usado é o caracter >. Mas pode ser mudado para os caracteres mostrados acima. MAIL - É o nome do arquivo onde ficam guardados os e-mails. COLUMNS - Contém o número de colunas da tela do terminal. LINES - Contém o número de linhas da tela do terminal.