Como encontro o número de argumentos passados para um script Bash?
Isto é o que eu tenho atualmente:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
Existem outras (melhores) maneiras de fazer isso?
Como encontro o número de argumentos passados para um script Bash?
Isto é o que eu tenho atualmente:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
Existem outras (melhores) maneiras de fazer isso?
Respostas:
O número de argumentos é $#
Pesquise nesta página para saber mais: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
argc
em C-como idiomas, $#
será 0
se não houver argumentos passados para o script, 1
se há um argumento, etc.
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
echo "The length of argument '$var' is: ${#var}"
(( count++ ))
(( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
bc
, ou outra coisa (ksh93 e zsh também podem fazer matemática decimal). Seu código inclui cifrões para algumas variáveis, mas não para outras. Você deve ser consistente em usá-los ou não. Por dentro, (())
eles não são necessários. Eles estão, no entanto, nas echo
declarações.
para adicionar a referência original:
Você pode obter o número de argumentos do parâmetro especial $#
. O valor 0 significa "sem argumentos". $#
é somente leitura.
Quando usado em conjunto com o shift
processamento de argumentos, o parâmetro especial $#
é decrementado cada vez que o Bash Builtin shift
é executado.
consulte o Manual de referência do bash na seção 3.4.2 Parâmetros especiais :
"O shell trata vários parâmetros especialmente. Esses parâmetros só podem ser referenciados "
e nesta seção para a palavra-chave $ # "Expande para o número de parâmetros posicionais em decimal."
Abaixo está o mais fácil -
cat countvariable.sh
echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'
Resultado :
#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
echo "$@" | awk '{print NF}'
i+1
na variáveli
se houver algum argumento presente.