Як знайти довжину масиву в оболонці?


78

Як знайти довжину масиву в оболонці?

Наприклад:

arr=(1 2 3 4 5)

І я хочу отримати його довжину, яка в цьому випадку дорівнює 5.

Відповіді:


99
$ a=(1 2 3 4)
$ echo ${#a[@]}
4

3
Що @тут робити?
Ахмед Ахтар

6
@AhmedAkhtar Там пристойне пояснення тут . В принципі, [*]і [@]як «вибухають» масиви в токенізірованному рядки, але [@]може зберегти пробілу в токенах. Однак, підраховуючи елементи, це, здається, не має значення; arr=(foo "bar baz"); echo ${arr[*]}відбитки 2, ні 3.
Кайл Странд

Це спрацювало для мене, але лише після видалення [@]на Mac. GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)якщо у когось однакова проблема.
Praveen Premaratne

1
@PraveenPremaratne Використання [@]- це функція для bash 4 і новіших версій . Bash можна оновити через homebrew: itnext.io/upgrading-bash-on-macos-7138bd1066ba
Джо Садоскі,

Без цього [@]він повертає довжину першого елемента для мене (за допомогою Bash 4.4.20 (1) -реліз).
Sussch

24

З посібника Bash :

$ {# параметр}

Довжина символів розширеного значення параметра підставляється. Якщо параметром є ' ' або '@', заміненим значенням є кількість позиційних параметрів. Якщо параметром є ім'я масиву, підписане на ' ' або '@', замінене значення - це кількість елементів у масиві. Якщо параметр - це індексоване ім'я масиву, підписане від'ємним числом, це число інтерпретується як відносно одного, що перевищує максимальний індекс параметра, тому негативні індекси відлічують від кінця масиву, а індекс -1 посилається на останній елемент.

Довжина рядків, масивів та асоціативних масивів

string="0123456789"                   # create a string of 10 characters
array=(0 1 2 3 4 5 6 7 8 9)           # create an indexed array of 10 elements
declare -A hash
hash=([one]=1 [two]=2 [three]=3)      # create an associative array of 3 elements
echo "string length is: ${#string}"   # length of string
echo "array length is: ${#array[@]}"  # length of array using @ as the index
echo "array length is: ${#array[*]}"  # length of array using * as the index
echo "hash length is: ${#hash[@]}"    # length of array using @ as the index
echo "hash length is: ${#hash[*]}"    # length of array using * as the index

вихід:

string length is: 10
array length is: 10
array length is: 10
hash length is: 3
hash length is: 3

Робота з $@масивом аргументів:

set arg1 arg2 "arg 3"
args_copy=("$@")
echo "number of args is: $#"
echo "number of args is: ${#@}"
echo "args_copy length is: ${#args_copy[@]}"

вихід:

number of args is: 3
number of args is: 3
args_copy length is: 3

20

Припускаючи bash:

~> declare -a foo
~> foo[0]="foo"
~> foo[1]="bar"
~> foo[2]="baz"
~> echo ${#foo[*]}
3

Отже, ${#ARRAY[*]}розширюється до довжини масиву ARRAY.


Це питання досить старе, але я хотів би знати, як зберігати цю довжину масиву в одній змінній? Я спробував щось на зразок foo = $ {# foo [*]}, але оболонка видає command not foundпомилку.
Шехар

1
Що це таке *? Чим він відрізняється від @?
jameshfisher

@jameshfisher При цьому не застосовується.
розмотати

7

у tcsh або csh:

~> set a = ( 1 2 3 4 5 )
~> echo $#a
5

Жодне з перерахованого не працює для мене! Це працює ідеально !! Не могли б ви, будь ласка, докладніше ??
saravanakumar

6

У Fish Shell довжину масиву можна знайти за допомогою:

$ set a 1 2 3 4
$ count $a
4

Я не вірю, що countв Unix існує команда. Яку ОС ви використовуєте?
codeforester

4
@codeforester Це команда оболонки, очевидно доступна в оболонці Fish. ОС насправді не має значення.
matli

3

це добре працює для мене

    arglen=$#
    argparam=$*
    if [ $arglen -eq '3' ];
    then
            echo Valid Number of arguments
            echo "Arguments are $*"
    else
            echo only four arguments are allowed
    fi

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