Parâmetros
Podemos passar parâmetros para o shell script assim como na maioria dos programas. Os parâmetros são variáveis, digamos, especiais. Para começar elas não obedecem as regras de nomeclatura de variáveis, pois elas usam números; e também nós não podemos mudar o valor destas variáveis pelas vias "tradicionais", para mudar o valor destas nós temos que contar com a ajuda do shift e/ou do set (como veremos adiante).
Veja esta relação:
parâmetro | significado |
---|---|
$0 |
é o nome do shell script (a.k.a. parâmetro zero). |
$1 a $9 |
$1 é o primeiro parâmetro, $9 o nono, e assim por diante. |
${10}, ${11}, ... |
quando o número do parâmetro possui mais de um dígito é necessário o uso das chaves. |
$* |
todos os parâmetros em uma única string (exceto o $0). |
$@ |
todos os parâmetros, cada um em strings separadas (exceto $0). |
$# |
número de parâmetros (sem contar com o $0). |
Pra ficar mais claro, nada melhor do que um exemplo:
#!/bin/bash
# parametros.sh
#
# "basename" serve para eliminar o caminho do arquivo e mostrar
# somente o último nome dele. Neste caso: parametros.sh
echo "Nome do script: $(basename $0)"
echo "Número total de parâmetros: $#"
echo "Primeiro parâmetro: $1"
echo "Segundo parâmetro: $2"
echo "Décimo quinto parâmetro: ${15}"
echo "Todos os parâmetros: $*"
$ ./parametros.sh a b c d e f g h i j l m n o p q r s t u v x z
Nome do script: parametros.sh
Número total de parâmetros: 23
Primeiro parâmetro: a
Segundo parâmetro: b
Décimo quinto parâmetro: p
Todos os parâmetros: a b c d e f g h i j l m n o p q r s t u v x z
Se você não entendeu direito a diferença entre o $*
e o $@
, então dê
uma olhada no seguinte script (se não entendê-lo tudo bem, siga em frente
e quando aprender sobre o if
e o for
leia-o novamente):
#!/bin/bash
# testargs.sh
#
# Ao executar este script entre alguns parametros. Ex.:
# [prompt]$ ./testargs.sh um dois tres quatro
if [ -z "$1" ]; then
echo "Uso: `basename $0` argumento1 argumento2 etc."
exit 1
fi
echo
echo "Listando argumentos com \"\$*\":"
num=1
for arg in "$*"; do
echo "Arg #$num = $arg"
num=$[ $num + 1 ]
done
# Conclusão: $* mostra todos os argumentos como uma única string
echo
echo "Listando argumentos com \"\$@\":"
num=1
for arg in "$@"; do
echo "Arg #$num = $arg"
num=$[ $num + 1 ]
done
# Conclusão: $@ mostra cada argumento em strings separadas
echo
shift
O bash possui um comando embutido que lida com parâmetros: o shift
.
Quando você usa o shift o primeiro parâmetro da lista some e o segundo vai
para $1
o terceiro vai para $2
, e assim por diante. Você pode ainda
especificar quantas "casas" você quer que os parâmetros "andem" à
esquerda através de shift n
onde n
é o número de casas. Mas atenção, se n
for maior que o número de parâmetros o shift não é executado.
Veja este exemplo:
#!/bin/bash
# shift-example.sh
echo "$#: $*"
echo -e "executando \"shift\""
shift
echo "$#: $*"
echo -e "executando \"shift 5\""
shift 5
echo "$#: $*"
echo -e "executando \"shift 7\""
shift 7
echo "$#: $*"
$ ./shift-exemplo.sh 1 2 3 4 5 6 7 8 9 0
10: 1 2 3 4 5 6 7 8 9 0
executando "shift"
9: 2 3 4 5 6 7 8 9 0
executando "shift 5"
4: 7 8 9 0
executando "shift 7"
4: 7 8 9 0
Os valores que saem são perdidos. Use com atenção!
set (para editar parâmetros)
O que vou passar neste tópico não é sobre como usar "todo o poder do comando set", e sim como usar set especificamente para editar parâmetros. Não tem nenhum segredo! Veja este exemplo:
set um dois tres
Isso fará com que $1
seja um
, $2
seja dois
, $3
seja tres
e só!
Não existirá $4
, $5
, etc. mesmo que eles tenham sido usados. Veja um
exemplo de script:
#!/bin/bash
# setparam.sh
echo "Os $# parâmetros passados inicialmente foram: $@"
echo
echo "e agora eu vou alterá-los!"
echo "como eu sou mau... (huahuahau risada diabólica huahuahuha)"
echo
set um dois tres
echo "Os $# novos parâmetros agora são: $@"
echo
Não interessa quantos parâmetros você passar para este script, no
final você só terá $1
, $2
e $3
valendo um
, dois
e tres
,
respectivamente.
No Mextract.sh (capítulo Exemplos Variados) esta característica do set
é muito
bem aproveitada!