Як знайти кількість аргументів, переданих сценарію Bash?


182

Як знайти кількість аргументів, переданих сценарію Bash?

Ось що я зараз маю:

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

Чи існують інші (кращі) способи цього?


4
Цей код просто зберігає буквальну рядок i+1у змінній, iякщо є якісь аргументи.
Філіпп

Відповіді:


279

Кількість аргументів є $#

Шукайте його на цій сторінці, щоб дізнатися більше: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST


36
Для уточнення: на відміну від argcмов, подібних до С, $#буде, 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 ", що допомагає мені отримати невідоме число аргументів і зробити деяку математику (ви можете редагувати операнд) Спасибі за Денніс Вільямсон, я це зробив. Я відправлю код, тому що це може бути корисним для когось.
kaan yılmaz

1
@ kaanyılmaz: Єдина проблема з цим полягає в тому, що Bash виконує лише цілу арифметику. Якщо ви хочете десяткових знаків, вам потрібно буде використовувати AWK, bcабо щось інше (ksh93 і zsh також можуть робити десяткову математику). Ваш код містить знаки долара для деяких змінних, але не для інших. Ви повинні бути послідовними щодо їх використання чи ні. Всередині (())вони не потрібні. Однак вони є у echoтвердженнях.
Призупинено до подальшого повідомлення.

Я не дуже хороший з Linux, я просто змінив ваш код, як мені потрібно. В основному це ваш код
kaan yılmaz

Дякую за код, це дуже добре.
Smeterlink

12

щоб додати оригінал посилання:

Ви можете отримати кількість аргументів із спеціального параметра $#. Значення 0 означає "немає аргументів". $#є лише для читання

При використанні спільно з shiftдля обробки аргументів спеціальний параметр $#зменшується щоразу, коли Bash Builtin shiftвиконується.

див. Довідковий посібник Баша в розділі 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.