如何在shell中找到数组的长度?


78

如何在shell中找到数组的长度?

例如:

arr=(1 2 3 4 5)

我想得到它的长度,在这种情况下为5。

Answers:


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 Using[@]是bash 4及更高版本的功能。Bash可以通过自制软件进行更新:itnext.io/upgrading-bash-on-macos-7138bd1066ba
Joe Sadoski

如果没有,[@]它将为我返回第一个元素的长度(使用Bash 4.4.20(1)-release)。
Sussch '20

24

从Bash手册

$ {#parameter}

参数的扩展值的字符长度被替换。如果parameter为' '或'@',则替换的值为位置参数的数量。如果parameter是下标为' '或'@'的数组名称,则替换的值为数组中元素的数量。如果parameter是带有负数后缀的索引数组名称,则该数字将被解释为相对于大于参数最大索引的整数,因此负索引从数组末尾算起,索引-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的长度ARRAY


这个问题已经很老了,但我想知道如何将这个长度的数组存储在一个变量中?我尝试了类似foo = $ {#foo [*]}的方法,但是shell抛出command not found错误。
Shekhar 2013年

1
什么*@有何不同?
jameshfisher

@jameshfisher在这种用法中不是。
放松


6

鱼壳中,可以通过以下方式找到数组的长度:

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

我不相信countUnix中有命令。您正在使用哪个操作系统?
codeforester

4
@codeforester这是一个shell命令,显然可以在Fish shell中使用。操作系统并不重要。
马特里18-3-26

3

这对我来说很好

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

-5

对于那些仍在寻找将数组长度放入变量的方法的人:

foo=$(echo ${'ARRAY[*]}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.