Como encontro o número de argumentos passados ​​para um script Bash?

182

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?

sabri
fonte
4
Esse código simplesmente armazenaria a cadeia literal i+1na variável ise houver algum argumento presente.
Philipp
related: stackoverflow.com/questions/18568706/…
Ciro Santilli escreveu:

Respostas:

99
#!/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"
Pausado até novo aviso.
fonte
Também me ajudou, o que eu estava tentando fazer é; #! / bin / bash count = 0 soma = 0 avg = 0 para var em "$ @" do ((soma + = $ var)) ((contagem ++)) concluída ((avg = soma / $ contagem)) echo " soma dos números é: $ sum "echo" a média dos números é: $ avg ", o que me ajuda a obter números desconhecidos de argumentos e fazer algumas contas (você pode editar o operando) Obrigado por Dennis Williamson, eu fiz isso. Estou postando no código porque pode ser útil para alguém.
kaan yılmaz 4/16
1
@ kaanyılmaz: O único problema com isso é que o Bash faz aritmética inteira. Se você quiser casas decimais, precisará usar AWK 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 echodeclarações.
Pausado até novo aviso.
Eu não sou muito bom com linux, apenas modifiquei seu código conforme necessário. Basicamente, é o seu código
kaan yılmaz
Obrigado pelo código, é muito bom.
Smeterlink
12

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 shiftprocessamento 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."

Michael Brux
fonte
-1

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
VIPIN KUMAR
fonte
3
Pode ser escrito comoecho "$@" | awk '{print NF}'
user000001
-6

esse valor está contido na variável $#

Jeff Gaer
fonte
4
Além do fato de há quase exatamente o mesmo (mas correto) resposta que é 4 anos de idade, sua resposta está errada - deve ser$#
nachteil