Unidade III
–
Programação Script
Parte 3
Slides 07
–
◦
3.16
–
Expansão aritmética estilo C/C++
O duplo parêntesis (( ))
◦
3.17
–
Argumentos de linha de comando
Argumentos posicionais e variáveis especiais
Passando argumentos para outro script
O comando shift
◦
3.18
–
Teste condicional
O comando test
Teste com colchetes
◦
3.19
–
Estruturas condicionais de controle de fluxo
O comando if (se)
Estrutura condicional simples
Estrutura condicional composta
Aninhamento com elif
Operadores de testes condicionais
Operadores relacionais
Operadores de teste de arquivo
Operadores lógicos
O comando case (escolha/caso)
O duplo parênteses
(( ))
Similar ao comando let, o
((
...
))
permite construir uma expansão
aritmética, bem como um teste lógico.
É uma construção e também um mecanismo para permitir o estilo
C/C++ de manipulação de variáveis
no
Bash.
É possível passar um ou mais argumentos para um
script.
Os argumentos são passados através da linha de
comando (no momento da sua execução), separados por
um espaço.
São conhecidos como parâmetros ou
“argumentos
posicionais”
.
Sintaxe:
Argumentos posicionais e variáveis especiais
As variáveis especiais $
@
, $
#
, $
*
$
0
, $
1
,...,${
99
} fazem
referência aos argumentos posicionais passados ao script.
Variável
Descrição do Argumento
$
$
Identificação do processo do script (PID).
$
#
Quantidade de argumentos passados para o script.
$
@
Todos os argumento passados para o script.
$
*
Todos os argumento passados para o script.
$
0
Nome do script.
$
1
Primeiro argumento passado para o script.
$
2
Segundo argumento passado para o script.
Exemplo:
Exemplo da diferença entre $@ e $*
Crie o script abaixo:
Exemplo da diferença entre $@ e $* (continuação)
Crie 2 arquivos com nomes com espaços:
Rode o script assim:
ou dessa outra forma:
O comando
shift
O
shift
desloca os argumentos posicionais para a esquerda,
removendo o primeiro da lista.
Assim, $
2
passa a ser $
1
, $
3
passa a ser $
2
e assim
sucessivamente.
Automaticamente o valor da variável $
#
é
decrementado
.
O comando
shift
e não afeta parâmetro $
0
que contém
sempre o nome do script.
O deslocamento para a esquerda é de uma posição, podendo
ser de mais de uma, se especificado.
Exemplo:
O comando
test
É um comando interno do bash que retorna um valor
verdadeiro (0) ou falso (1), dependendo do resultado da
expressão avaliada.
Sintaxe:
test
<expressão>
Sintaxes de <expressão>:
operador arg
ou
arg1 operador arg2
Onde:
◦
operador
pode ser um operador de teste de arquivo, relacional,
lógico.
◦
arg
um operando ou expressão.
Teste com colchetes
[
ou
[ ]
ou
[[ ]]
O
[
é um comando interno considerado como sinônimo para o
comando
test
. Versões recentes de shells exigem o colchete de
fechamento.
O
[
avalia seus argumentos como uma expressão condicional até
encontrar o
]
.
O duplo
[ ]
é outra forma variante do comando
[
(
test
).
Os duplos
[[ ]]
é uma extensão mais versátil do
[ ]
(test), a fim de
se evitar erros de uso de operadores lógicos, bem como permitir
expansão de expressões regulares, porém não é padrão POSIX.
Exemplo: Os operadores &&, ||, <, e > funcionam dentro de um teste com [[ ]], ao
contrário de [ ].
O Bash considera os
[[ ]]
como sendo palavras chaves.
Sintaxes:
[
<expressão>
ou
[
<expressão>
]
ou
[[
<expressão>
]]
O comando
if
Diferente das outras linguagens, o
if
do shell não testa
condição.
O
if
verifica se o resultado do estado de saída de um
comando
test
é verdadeiro (0) ou falso (1).
Portanto, o que o comando
if
faz é
“testar”
a variável
$?
.
Sintaxe:
Onde <condição> é uma expressão relacional ou lógica entre
colchetes.
Obedecer à forma
x
[
x
condição
x
]
x
, onde
x
corresponde a um
espaço.
É o colchete
[
que invoca o comando
test
e o colchete
]
, que
delimita o fim, não é necessário em versões antigas de shells.
if
[
scondição
]
then
comandos
fi
ou
if
[
condição
]
;
then
comandos ...
fi
if
test
<condição>
then
comandos
fi
ou
if
test
<condição>
;
then
comandos ...
Estrutura condicional simples
if ... then
if
[
condição
]
then
Estrutura condicional composta
if ... then ... else
if
[
condição
]
then
comandos (se condição verdadeira)
else
Estrutura condicional composta aninhada
if [ condição1 ]
then
if
[ condição2 ]
then
comandos
else
comandos
fi
else
if
[ condição3 ]
then
comandos
else
Aninhamento com
elif
(senão se
el
se
if
)
if [ condição1 ]
then
comandos
elif
[ condição2 ]
then
comandos
elif
[ condição3 ]
then
comandos
else
Operadores relacionais
Operador
Descrição em inglês
Descrição em
português
-eq
Equal
Igual
-ne
Not equal
Diferente
-gt
Greater than
Maior do que
-ge
Greater than or equal
Maior ou igual
-lt
Less than
Menor do que
-le
Less than or equal
Menor ou igual
Operadores relacionais
Operador
Descrição em português
=
Igual
!=
Diferente
>
Maior do que
<
Menor do que
-z
String nula (sem conteúdo)
-n
String não nula
Observação:
Nas expressões de testes dentro dos colchetes, as
variáveis que contém strings com espaços devem
também estar entre aspas.
variavel1=“Este script”
variavel2=“testa
strings
”
if [
“
$variavel1
”
!=
“
$variavel2
”
]
Exemplos de comparação entre inteiros:
if [ 3 -eq 5 ]
if [ “$num1”
-
ne “$num2” ]
Exemplos de comparação entre strings:
if [ “$nome_arq1” = “$nome_arq2” ]
(se são iguais)
if [ “$data1” != “$data2” ]
(se são diferentes)
if [ -
z “$nome_arq1” ] (se é nula)
Exemplos de comparação entre strings:
if
[ “$nome_arq1” = “$nome_arq2” ]
(se são iguais)
if [ “$data1” != “$data2” ]
(se são diferentes)
if [ -
z “$nome_arq1” ] (se é nula)
Operadores de teste de arquivo
Usados em testes com arquivos ou diretórios:
Operador
Descrição em português
-d
É um diretório
-f
É um arquivo normal (não é diretório)
-e
O arquivo existe
-s
É um arquivo não vazio
-r
É um arquivo somente leitura (read-only)
-x
É um arquivo executável
-w
É um arquivo gravável
Exemplos de testes com arquivos e diretórios:
if [ -
s “$arquivo” ] (arquivo não vazio)
if [ -
f “$arquivo” ] (é um arquivo normal)
if [ -
d “$arquivo” ] (é um diretório)
if [ -
w “$arquivo” ] (arq.
com
permissão
gravação
)
if [ -
r “$arquivo” ] (arquivo
read-only)
Operadores lógicos
OPERADOR
DESCRIÇÃO
&&
e
(para avaliar duas condições)
||
ou (para avaliar duas condições)
-a
e
(para avaliar uma condição)
-o
ou (para avaliar uma condição)
!
não (tanto faz)
Exemplos de testes com operadores lógicos
if [ -f $arquivo
–
o
–
d $arquivo ] (uma
condição
)
if [ -f $arquivo ] || [ -d $arquivo ] (duas
condições
)
O comando
case
case
$variavel
in
padrão1) comando
comando
;;
padrão2) comando
comando
;;
padrãoN) comando
comando
;;
*) comando_default
comando_default
;;
esac
É similar ao comando switch da linguagem C , sendo, porém, útil
para o casamento strings ou padrões de cadeias de caracteres, por
intermédio de expressões regulares.
No comando case, podemos usar os caracteres abaixo, a
fim de criar padrões de cadeias de caracteres.
Exemplo 1:
case $opcao in
1) echo
“Você escolheu a
opcao
1”
;;
2) echo
“Você escolheu a
opcao
2”
;;
A versão 4.0 do Bash introduziu dois novos terminadores de
bloco no comando case:
◦
;;
&
Se o bloco de comandos for finalizado com este terminador, o
script não sairá do case e continuará testando os próximos
padrões.
◦
;
&
Exemplo 5:
Advanced Bash-Scripting Guide - Chapter 37. Bash, versions 2,
3, and 4 <
http://tldp.org/LDP/abs/html/bashver4.html
>
case "$1" in
[[:print:]] ) echo $1 é um caractere imprimível;;&
# O terminador ;;& testará o próximo padrão
Executando o exemplo 5 passando 3 como parâmetro:
3 é um caractere imprimível
3 é um carac. alfa/numérico
3 é um caractere numérico
Executando o exemplo 5 passando m como parâmetro :
m é um caractere imprimível
m é um carac. alfa/numérico
m é um carac. alfabético
m é uma letra minúscula
Executando o exemplo 5 passando / como parâmetro :
Estrutura condicional implícita
É uma construção, obtida apenas com o uso de comandos ou
testes lógicos, em que se consegue o desvio do fluxo de
execução de comandos sem o uso do
if
.
Lembrando:
&&
“e”
||
“ou”
Sintaxe:
<comandos>
&&
<se_sucesso_execute_esses_comando_tambem>
<comandos>
||
<mesmo_se_insucesso_execute_esses_tambem>
<teste_condic>
&&
<se_sucesso_execute_esses_comando_tambem>
<teste_condic>
||
<mesmo_se_insucesso_execute_esses_tambem>
Pode-se usar parênteses ou chaves para agrupar
Exemplo 3:
Este script equivale ao exemplo anterior, sem a execução
de teste condicional, apenas de comando
pág.