Как узнать количество аргументов, переданных скрипту Bash?

182

Как узнать количество аргументов, переданных скрипту Bash?

Вот что у меня сейчас:

#!/bin/bash
i=0
for var in "$@"
do
  i=i+1
done

Есть ли другие (лучшие) способы сделать это?

Сабри
источник
4
Этот код просто хранит литеральную строку i+1в переменной, iесли присутствуют какие-либо аргументы.
Филипп
связанные: stackoverflow.com/questions/18568706/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

279

Количество аргументов $#

Найдите его на этой странице, чтобы узнать больше: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

zsalzbank
источник
36
Чтобы уточнить: в отличие от argcC-подобных языков, $#будет, 0если в сценарий не переданы аргументы, 1если есть один аргумент и т. Д.
Владимир Пантелеев
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"
Приостановлено до дальнейшего уведомления.
источник
Это помогло мне тоже, что я пытался сделать это; #! / bin / bash count = 0 sum = 0 avg = 0 для var в "$ @" do ((sum + = $ var)) ((count ++)) done ((avg = sum / $ count)) echo " сумма чисел: $ sum "echo" среднее значение чисел: $ avg ", которое помогает мне получить неизвестные числа аргументов и выполнить некоторые математические операции (вы можете редактировать операнд). Спасибо за Деннис Уильямсон, я сделал это. Я публикую код, потому что он может быть полезен для кого-то.
Каан Йылмаз
1
@ kaanyılmaz: Единственная проблема в том, что Bash выполняет только целочисленную арифметику. Если вам нужны десятичные дроби, вам нужно использовать AWK bcили что-то еще (ksh93 и zsh также могут выполнять десятичную математику). Ваш код включает знаки доллара для некоторых переменных, но не для других. Вы должны быть последовательны в использовании их или нет. Внутри (())они не нужны. Они, однако, в echoзаявлениях.
Приостановлено до дальнейшего уведомления.
Я не очень хорошо разбираюсь в Linux, я просто изменил ваш код по мере необходимости. Это ваш код в основном
kaan yılmaz
Спасибо за код, это очень хорошо.
Smeterlink
12

добавить исходную ссылку:

Вы можете получить количество аргументов из специального параметра $#. Значение 0 означает «без аргументов».$#только для чтения.

Когда используется вместе с shiftдля обработки аргументов, специальный параметр $#уменьшается каждый раз, когда Bash Builtinshift .

см. справочное руководство Bash в разделе 3.4.2 «Специальные параметры» :

  • «Оболочка обрабатывает несколько параметров специально. На эти параметры можно ссылаться только »

  • и в этом разделе для ключевого слова $ # «Расширяется до количества позиционных параметров в десятичном виде.»

Майкл Брюкс
источник
-1

Ниже самый простой -

кошка countvariable.sh

echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'

Вывод :

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
ВИПИН КУМАР
источник
3
Может быть записано какecho "$@" | awk '{print NF}'
user000001
-6

это значение содержится в переменной $#

Джефф Гаер
источник
4
Помимо того факта, что есть почти точно такой же (но правильный) ответ, которому 4 года, ваш ответ неправильный - так и должно быть$#
nachteil