É possível fornecer a um script, na linha de comando, os argumentos necessários para sua execução. Esses argumentos são chamados de parâmetros. Existem duas categorias de parâmetros: os posicionais e os especiais.
Os argumentos são simplesmente passados em parâmetros na linha de comando, na invocação de um script. Eles são então atribuídos nas variáveis reservadas 1,2,3,...9,10,11,... e podem ser chamados com a ajuda das expressões $1,$2...${10},${11}...
Observação: o shell Bourne é limitado aos parâmetros de 0 a 9.
Eis um pequeno script para afixar certos argumentos passados em parâmetros em função de sua posição.
#!/bin/bash
# affiche_param.sh
echo "O 1° parâmetro é: $1"
echo "O 3° parâmetro é: $3"
echo "O 10° parâmetro é: ${10}"
echo "O 15º parâmetro é : ${15}"
Basta evocar o script passando um certo número de parâmetros:
affiche_param.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
O 1° parâmetro é : 1
O 3° parâmetro é : 3
O 10° parâmetro é : 10
O 15° parâmetro é : 15
Ou ainda:
./affiche_param.sh um 2 três 4 5 6 7 8 9 dez 11 12 13 14 quinze 16 17
O 1° parâmetro é : um
O 3° parâmetro é : três
O 10° parâmetro é : dez
O 15° parâmetro é : quinze
Se alguns parâmetros contêm características especiais ou espaços, é preciso cotá-los:
./affiche_param.sh un 2 "o 3°" 4 5 6 7 8 9 dez 11 12 13 14 "o 15°" 16 17
O 1° parâmetro é : um
O 3° parâmetro é : o 3°
O 10° parâmetro é: dez
O 15° parâmetro é: o 15°
São também variáveis reservadas que permitem efetuar tratamentos nos parâmetros . Estes parâmetros são os seguintes:
$0: contém o nome do script tal como ele foi invocado
$*: conjunto dos parâmetros na forma de um só argumento
$@: conjunto dos argumentos, um argumento por parâmetro
$#: número de parâmetros passados para o script
$?: código volta do último comando
$$: PID su shell que se executa o script
$!: PID do último processo lançado em último plano
Eis outro pequeno script que instala o conjunto dos parâmetros especiais vistos acima:
#!/bin/bash
# affiche_param_2.sh
# Afixagem do nome do script
echo "O nome de meu script é : $0"
# Afixagem do número de parâmetros
echo "Você passou $# parâmetros"
# Lista dos parâmetros (um só argumento)
for param in "$*"
do
echo "Eis a lista dos parâmetros (um só argumento) : $param"
done
# Lista dos parâmetros (um parâmetro por argumento)
echo " Eis a lista dos parâmetros (um parâmetro por argumento) :"
for param in "$@"
do
echo -e "\tParâmetro : $param"
done
# Afixagem do processo
echo "O PID o shell que executa o script é : $$"
# Execução de um comando que se executa em plano de fundo
sleep 100 &
# Afixagem do processo lançado em plano de fundo
echo "O PID do último comando em plano de fundo é : $!"
# Afixagem do código retorno do último "echo"
echo "O código retorno do comando precedente é : $?"
# Geração de um erro
echo "Geração de um erro..."
# Afixagem de mau comando
echo "ls /etc/password 2>/dev/null"
ls /etc/password 2>/dev/null
# Afixagem do código retorno do último comando
echo "O código retorno do comando precedente é : $?"
exit
Isso resulta na seguinte invocação:
./affiche_param_2.sh 1 2 3 quatro 5 six
O nome de meu script é: ./affiche_param_2.sh
Você passou 6 parâmetros
Eis a lista dos parâmetros (um argumento somente) : 1 2 3 quatro 5 seis
Eis a lista dos parâmetros (um parâmetro por argumento) :
Parâmetro : 1
Parâmetro : 2
Parâmetro : 3
Parâmetro : quatro
Parâmetro : 5
Parâmetro : seis
O PID do shell que executa o script é: 6165
O PID do último comando executado em plano de fundo: 6166
O código de retorno do comando precedente é: 0
Geração de um erro...
ls/etc/password 2>/dev/null
O código de retorno do comando precedente é: 1
É possível afetar diretamente parâmetros shell graças ao comando "set". Para isso, basta um simples comando como:
set param1 param2 param3
: inicializa automaticamente os parâmetros posicionais "$1,$2,$3" com os valores.
"param1,param2,param3", apagando desta forma os antigos valores se por acaso eles existirem. Os parâmetros especiais "#,* e @" são automaticamente atualizados.
$ set param1 param2 param3
$ echo "Número de parâmetros : $#"
Número de parâmetros ll: 3
$ echo O segundo parâmetro é : $2"
O 2° parâmetro é : param2
$ echo Os parâmetros são : $@"
Os parâmetros são: param1 param2 param3
$ set pêssego maçã
$ echo " Número de parâmetros: $#"
Número de parâmetros : 2
$ echo "Os parâmetros são : $@"
Os parâmetros são : pêssego maçã
Essa funcionalidade pode mostrar-se útil no tratamento de arquivos linha por linha para isolar cada palavra (campo), e formatar a saída.
$ IFS=":"; set $(grep $USER /etc/passwd)
$ echo -e "Login :\t$1\nNom :\t$5\nID :\t$3\nGroup :\t$4\nShell :\t$7"
Login: jp
Nome: Jean-Philippe
ID: 500
Grupo: 500
Shell: /bin/bash
O comando interno "shift" permite defasar os parâmetros. O valor do 1° parâmetro ($1) é substituído pelo valor do 2° parâmetro ($2), o do 2º parâmetro ($2) pelo valor do 3° ($3) e assim sucessivamente. Pode-se indicar um argumento (shift n) com o número de posições que é preciso defasar os parâmetros.
Veja uma instalação do emprego do comando interno shift:
#!/bin/bash
# decale_param.sh
echo
echo " Número de parâmetros: $#"
echo "O 1° parâmetro é: $1"
echo "O 3° parâmetro é: $3"
echo "O 6° parâmetro é: $6"
echo "O 10° parâmetro é: ${10}"
echo "============================================="
echo " Defasagem de um passo com o comando \"shift\""
shift
echo " Número de parâmetros: $#"
echo "O 1° parâmetro é: $1"
echo "O 3° parâmetro é: $3"
echo "O 6° parâmetro é: $6"
echo "O 10° parâmetro é: ${10}"
echo "============================================="
echo " Defasagem de quatro passos com o comando \"shift 4\""
shift 4
echo "Número de parâmetros: $#"
echo "O 1° parâmetro é: $1"
echo "O 3° parâmetro é: $3"
echo "O 6° parâmetro é: $6"
echo "O 10° parâmetro é: ${10}"
echo
E seu resultado:
./decale_param.sh 1 2 3 4 5 6 7 8 9 10
Número de parâmetros: 10
O 1° parâmetro é: 1
O 3° parâmetro é: 3
O 6° parâmetro é: 6
O 10° parâmetro é: 10
=============================================
Defasagem de um passo com o comando "shift"
Número de parâmetros : 9
O 1° parâmetro é: 2
O 3° parâmetro é: 4
O 6° parâmetro é: 7
O 10° parâmetro é:
=============================================
Defasagem de quatro passos com o comando "shift 4"
Número de parâmetros : 5
O 1° parâmetro é: 6
O 3° parâmetro é: 8
O 6° parâmetro é:
O 10° parâmetro é: