De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Argumentos em Shell Scripts

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 02 de janeiro de 2019

A shell Bash possui diversos parâmetros posicionais que podem ser referenciados mas não podem ser atribuídos. São usados para processar argumentos da linha de comando em um shell script, obter status de um processo, código de retorno, dentre outros. Estes parâmetros posicionais podem ser atribuídos a uma varíavel e seus valores podem ser usados para processamento adicional.

O quadro a seguir relaciona os principais parâmetros e seus significados:

Parâmetro Significado
$0 Identifica o comando emitido
$@ O conjunto dos argumentos
$* Relação dos argumentos fornecidos
$# Número de argumentos fornecidos
$? Código de retorno do último comando executado
$$ Número (pid) de identificação do processo
$! Identificação (pid) do último processo executado em background

$0: Identifica o comando emitido

Começaremos com os argumentos passados na linha de comandos. Estes argumentos recebem o nome de variáveis posicionais e são identificadas por $0, $1, $2, ...

A variável $0 indica o comando emitido. Por exemplo, no comando

$ ls a b c d

a variável $0 assume o valor ls. A variável $1 recebe o valor a, a variável $2 recebe o valor b e assim por diante.

Esta variável é bastante utilizada para se enviar avisos ao usuário quanto à sintaxe correta de uso de comandos. Por exemplo:

echo "Sintaxe: $0 arquivo_entrada arquivo_saida"

Se a linha acima se encontrasse em uma shell script chamada chname e a invocassemos sem especificar corretamente seus argumentos, receberiamos o seguinte aviso:

Sintaxe: chname arquivo_entrada arquivo_saida

$@: O conjunto dos argumentos

Expande para os parâmetros posicionais, começando em um. Quando a expansão ocorre dentro de aspas duplas, cada parâmetro expande para uma palavra separada, ou seja $@ expande para $1, $2, etc.

$*: Relação dos argumentos fornecidos

Todos os argumentos fornecidos como uma string separada por brancos.

$#: Número de argumentos fornecidos

Constitui uma norma de boa programação verificar este valor no início da shell e emitir mensagem de erro caso incorreto.

Exemplo



#!/bin/bash

if [ $# -ne 2 ]; then
        echo 1>&2 Sintaxe: $0 in out
        exit 1
fi 

No exemplo acima, se não forem fornecidos dois argumentos é exibida uma mensagem de erro para o usuário e é setado o código de retorno com o valor 1 para indicar que houve um erro de processamento.

$?: Código de retorno do último comando executado

Códigos de retorno iguais a zero indicam que o programa conseguiu executar sua tarefa com sucesso, ao passo que valores diferentes indicam algum tipo de erro. Este valor pode ser setado de dentro de uma shell através da diretiva exit.

Exemplo



if [ $? -eq 0 ]; then
	mv file file.old
else
	mv file file.err
fi

No exemplo acima é testado o resultado do último comando executado. Se for 0 (tudo ok) o arquivo chamado file é renomeado para file.old. Caso algum erro tenha ocorrido, o arquivo file é renomeado para file.err.

$$: Número (pid) de identificação do processo

Identificação do processo executando a shell. Bastante útil para criação de arquivos temporários.

Exemplo



$ tmpfile=/tmp/file$$
$ sed -e "s/$DE/$FROM" $1 > $tmpfile
$ mv $tmpfile $1

No exemplo acima, o arquivo fornecido como argumento na linha de comandos é editado pelo comando sed, onde todas as strings identificadas pela variável $DE são substituídas pela string identificada pela variável $PARA e a saída é gravada no arquivo /tmp/file$$ ($tmpfile).

Após a execução do comando sed o arquivo temporário é novamente gravado como $1 (arquivo original).

$!: Identificação (pid) do último processo executado em background

Exemplo



$ find . 1> lista.txt &
$ echo $!
1157

Para encerrar, um pequeno shell script para demonstrar o uso destes parâmetros posicionais:

$ cat ./params.sh
#!/bin/bash
echo "\$0: Nome do arquivo: "           $0
echo "\$1: 1º argumento: "              $1
echo "\$2: 2º argumento: "              $2
echo "\$3: 3º argumento: "              $3
echo "\$4: 4º argumento: "              $4
echo "\$*: Argumentos fornecidos: "     $*
echo "\$@: Argumentos fornecidos: "     $@
echo "\$#: Número de argumentos: "      $#
echo "\$$: PID do processo: "           $$

Executando este script temos:

$ ./params.sh aa bb cc dd
$0: Nome do arquivo:  ./params.sh
$1: 1º argumento:  aa
$2: 2º argumento:  bb
$3: 3º argumento:  cc
$4: 4º argumento:  dd
$*: Argumentos fornecidos:  aa bb cc dd
$@: Argumentos fornecidos:  aa bb cc dd
$#: Número de argumentos:  4
$$: PID do processo:  7013

Referências

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida