Shell script - Bash
Estrutura geral de um script Shell
Os scripts permitem construir esquemas de execução complexos a partir dos comandos básicos do shell. A forma mais elementar de arquivo de script é apenas um conjunto de comandos em um arquivo texto, com permissões de execução habilitadas.
Parâmetros de entrada
Os argumentos da linha de comando são passados para o shell através da variável local
$argv
. Os campos individuais dessa variável podem ser acessados como em uma variável local qualquer. Além disso, uma série de atalhos é definida para facilitar o acesso a esses parâmetros: $0
: o nome do script$n
: o n-ésimo argumento da linha de comando$*
: todos os argumentos da linha de comando$#
: número de argumentos$?
: status do último comando executado (status <> 0 indica erro)$$
: número de processo (PID) do shell que executa o script
listaparams
:#!/bin/bash
# exemplo de uso dos parâmetros de entrada
echo "Nome do script : $0"
echo "Primeiro parâmetro : $1"
echo "Todos os parâmetros : $*"
echo "Numero de parametros : $#"
echo "Numero deste processo : $$"
exit 0
Chamando o script acima com alguns parâmetros se obtém a seguinte resposta:~> listaparams banana tomate pessego melao pera uva
Nome do script : listaparams
Primeiro parâmetro : banana
Todos os parâmetros : banana tomate pessego melao pera uva
Numero de parametros : 6
Numero deste processo : 2215
~>
Controle de fluxo
Existem diversos construtores de controle de fluxo que podem ser usados em scripts BASH-Shell. Os principais são descritos a seguir.
Condições
Como na maioria das linguagens, no shell Bash, testes de condições são realizados por estruturas do tipo if-then-else. As condições testadas são os status de saída da execução de comandos (o valor inteiro retornado pela chamada de sistema
Essa lógica “ao contrário” pode causar uma certa confusão aos iniciantes. Assim, para simplificar a programação de scripts, é definido um operador
Os principais operadores de teste disponíveis são:
Operador if-then
exit()
do comando). Caso o status seja zero (0), a condição é considerada verdadeira: if cmp $file1 $file2 >/dev/null # testa o status do comando cmp then echo "os arquivos são iguais" else echo "os arquivos são distintos" fi
Essa lógica “ao contrário” pode causar uma certa confusão aos iniciantes. Assim, para simplificar a programação de scripts, é definido um operador
test
condition, que também pode ser representado por [
condition ]
e retorna zero (0) se a condição testada for verdadeira:if [ $n1 -lt $n2 ] # $n1 é menor que $n2? then echo "$n1 é menor que $n2" fi if test $n1 -lt $n2 # $n1 é menor que $n2? then echo "$n1 é menor que $n2" fi
Os principais operadores de teste disponíveis são:
Operador if-then
if comando then ... fi # testa o status do comando cmp if cmp file1 file2 >/dev/null then echo "Os arquivos são iguais" fiOperador if-then-else
if comando then ... else ... fi # testa a existência de $file1 if [ -e "$file1" ] then echo "$file1 existe" else echo "$file1 não existe" fiOperador if-then-elif-else
if comando 1 then ... elif comando 2 then ... else ... fi # compara as variáveis $n1 e $n2 if [ $n1 -lt $n2 ] then echo "$n1 < $n2" elif [ $n1 -gt $n2 ] then echo "$n1 > $n2" else echo "$n1 = $n2" fiOperador case
case variável in "string1") ... break;; "string2") ... break;; *): ... break;; esac case $opt in "-c") complete=1 ;; "-s") short=1 ; name="" ;; *) echo "opção $opt desconhecida" ; exit 1 ;; esacOs principais tipos de teste disponíveis são:
- Comparações entre números
-eq
: igual a-ne
: diferente de-gt
: maior que-ge
: maior ou igual a-lt
: menor que-le
: menor ou igual a-a
: AND binário (bit a bit)-o
: OR binário (bit a bit)
- Comparações entre strings usando
[]
=
: igual a!=
: diferente de-z
: string de tamanho zero
- Comparações entre strings usando
[[]]
⇐
: menor ou igual a (lexicográfico)>=
: maior ou igual a (lexicográfico)
- Associações entre condições
&&
: AND lógico||
: OR lógico
-op
, onde op corresponde ao teste desejado. Os principais testes são: e
: a entrada exister
: a entrada pode ser lidaw
: a entrada pode ser escritaO
: o usuário é o proprietário da entradas
: tem tamanho maior que zerof
: é um arquivo normald
: é um diretórioL
: é um link simbólicob
: é um dispositivo orientado a blococ
: é um dispositivo orientado a caracaterep
: é um named pipe (fifo)S
: é um socket special fileu
: tem o bit SUID habilitadog
: tem o bit SGID habilitadoG
: grupo da entrada é o mesmo do proprietáriok
: o stick bit está habilitadox
: a entrada pode ser executadant
: Verifica se um arquivo é mais novo que outroot
: Verifica se um arquivo é mais velho que outroef
: Verifica se é o mesmo arquivo (link)
arquivo='/etc/passwd' if [ -e $arquivo ] then if [ -f $arquivo ] then if [ -r $arquivo ] then source $arquivo else echo "Nao posso ler o arquivo $arquivo" fi else echo "$arquivo não é um arquivo normal" fi else echo "$arquivo não existe" fi
Laços
Laço for
for variável in lista de valores do ... done for i in *.c do echo "compilando $i" cc -c $i doneLaço while
while condição do ... done i=0 while [ $i -lt 10 ] do echo $i let i++ doneOperador select
select variável in lista de valores do ... done select f in "abacate" "pera" "uva" "banana" "morango" do echo "Escolheu $f" doneAlém das estruturas acima, algumas outras podem ser usadas para executar comandos em situações específicas:
`comando`
: substitui a expressão entre crases pelo resultado (stdout
) da execução do comando. Por exemplo, a linha de comando abaixo coloca na variávelarqs
os nomes de arquivos retornados pelo comandofind
:
arqs=`find /etc -type f -iname '???'`
comando1; comando2; comando3
: executa seqüencialmente os comandos indicados
Operadores aritméticos
Variáveis contendo números inteiros podem ser usadas em expressões aritméticas e lógicas. A atribuição do resultado de uma expressão aritmética a uma variável pode ser feita de diversas formas. Por exemplo, as três expressões a seguir têm o mesmo efeito:
i=$((j + k)) let i=j+k i=`expr $j + $k`Os principais operadores aritméticos disponíveis são:
+ - * /
: aritmética básica**
: potenciação%
: módulo (resto)+= -= *= /= %=
: aritmética e atribuição (como em C)« »
: deslocamento de bits«= »=
: deslocamento e atribuição& |
: AND e OR binários&= |=
: AND e OR binários com atribuição!
: NOT binário^
: XOR binário&& ||
: AND e OR lógicos
OBS:
#!/bin/bash --noprofile # A opção --noprofile inibe a leitura dos arquivos de inicialização # do shell, tornando o lançamento do script muito mais rápido.
--
Fonte: Shell Script
Nenhum comentário:
Postar um comentário