Wie finde ich die Länge eines Arrays in der Shell?

75

Wie finde ich die Länge eines Arrays in der Shell?

Zum Beispiel:

arr=(1 2 3 4 5)

Und ich möchte seine Länge erhalten, die in diesem Fall 5 beträgt.

Arunachalam
quelle

Antworten:

96
$ a=(1 2 3 4)
$ echo ${#a[@]}
4
Ghostdog74
quelle
3
Was macht @hier?
Ahmed Akhtar
6
@AhmedAkhtar Es gibt eine anständige Erklärung hier . Grundsätzlich [*]und [@]beide "explodieren" Arrays in eine Token-Zeichenfolge, [@]können jedoch Leerzeichen innerhalb von Token beibehalten . Beim Zählen von Elementen scheint dies jedoch keine Rolle zu spielen. arr=(foo "bar baz"); echo ${arr[*]}druckt 2nicht 3.
Kyle Strand
Dies funktionierte bei mir aber erst nach dem Entfernen [@]auf dem Mac. GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)wenn jemand das gleiche Problem hat.
Praveen Premaratne
1
@PraveenPremaratne Using [@]ist eine Funktion für Bash 4 und höher . Bash kann über Homebrew aktualisiert werden: itnext.io/upgrading-bash-on-macos-7138bd1066ba
Joe Sadoski
Ohne das gibt [@]es die Länge des ersten Elements für mich zurück (mit Bash 4.4.20 (1) -release).
Sussch
23

Aus dem Bash- Handbuch :

$ {# Parameter}

Die Länge des erweiterten Werts des Parameters in Zeichen wird ersetzt. Wenn der Parameter ' ' oder '@' ist, ist der ersetzte Wert die Anzahl der Positionsparameter. Wenn der Parameter ein Array-Name ist, der durch ' ' oder '@' gekennzeichnet ist, ist der ersetzte Wert die Anzahl der Elemente im Array. Wenn parameter ein indizierter Array-Name ist, der durch eine negative Zahl gekennzeichnet ist, wird diese Zahl als relativ zu einem Wert interpretiert, der größer als der maximale Index des Parameters ist, sodass negative Indizes vom Ende des Arrays zurückzählen und ein Index von -1 auf den letzten verweist Element.

Länge von Strings, Arrays und assoziativen Arrays

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

Ausgabe:

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

Umgang mit $@dem Argument Array:

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

Ausgabe:

number of args is: 3
number of args is: 3
args_copy length is: 3
Codeforester
quelle
19

Angenommen, Bash:

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

Erweitert ${#ARRAY[*]}sich also auf die Länge des Arrays ARRAY.

entspannen
quelle
Diese Frage ist ziemlich alt, aber ich möchte wissen, wie diese Länge des Arrays in einer Variablen gespeichert werden kann. Ich habe so etwas wie foo = $ {# foo [*]} versucht, aber die Shell wirft einen command not foundFehler.
Shekhar
1
Was ist *? Wie unterscheidet es sich von @?
Jameshfisher
@jameshfisher Bei dieser Verwendung ist dies nicht der Fall.
Abroller
7

in tcsh oder csh:

~> set a = ( 1 2 3 4 5 )
~> echo $#a
5
Rahul Mahajan
quelle
Keiner der oben genannten funktioniert für mich! Das funktioniert perfekt !! Könnten Sie bitte mehr Details?
Saravanakumar
6

In der Fischschale kann die Länge eines Arrays gefunden werden mit:

$ set a 1 2 3 4
$ count $a
4
Schaden
quelle
Ich glaube nicht, dass es countin Unix einen Befehl gibt . Welches Betriebssystem verwenden Sie?
Codeforester
4
@codeforester Es ist ein Shell-Befehl, der offensichtlich in der Fish-Shell verfügbar ist. Das Betriebssystem spielt keine Rolle.
Matli
3

das funktioniert gut für mich

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

Für diejenigen, die noch nach einer Möglichkeit suchen, die Länge eines Arrays in eine Variable zu setzen:

foo=$(echo ${'ARRAY[*]}
user3771114
quelle