是否有一个bash命令可以告诉shell变量的大小

Ank*_*wal 11 linux bash

有没有办法从命令行中找到shell变量的大小(使用的内存),而不使用C?

Pau*_*ce. 18

这会告诉您名为"var"的标量变量的值中有多少个字符:

echo ${#var}
Run Code Online (Sandbox Code Playgroud)

这告诉你名为"array"的数组中的元素数量:

echo ${#array[@]}
Run Code Online (Sandbox Code Playgroud)

这告诉你数组元素中的字符数:

echo ${#array[3]}
Run Code Online (Sandbox Code Playgroud)

如果您尝试获取数组的大小而忽略[@]索引,则获得元素0的长度:

$ array=(1 22 333 4444)
$ echo ${#array}
1
$ echo ${#array[@]}
4
$ echo ${#array[2]}
3
Run Code Online (Sandbox Code Playgroud)

如果你想要一个数组的所有元素的总长度,你可以迭代数组并添加它们,你可以使用IFS和一些类似于下面的步骤,或者你可以:

$ tmp="${array[*]}"
$ echo $(( ${#tmp} - ${#array[@]} + 1 ))
10
Run Code Online (Sandbox Code Playgroud)

因为Bash支持稀疏数组,所以要小心使用数组中的元素数作为最后一个元素的索引:

$ array=(1 22 333 4444 55555)
$ echo ${#array[@]}
5
$ array[9]=999999999
$ echo ${#array[@]}
6
$ echo ${array[${#array[@]} - 1]}    # same as echo ${array[6 - 1]}

$ # only a newline is echoed since element 5 is empty (only if "nounset" option* is not set (default in most cases))
$ # when "nounset" option is set (possibly using command "set -u") then bash will print such error:
$ # bash: array[${#array[@]} - 1]: unbound variable
$ unset "array[1]"    # always quote array elements when you unset them
$ echo ${#array[@]}
5
$ echo ${array[${#array[@]} - 1]}    # same as echo ${array[5 - 1]}
55555
Run Code Online (Sandbox Code Playgroud)

那显然不是最后一个因素.要获得最后一个元素:

$ echo ${array[@]: -1}    # note the space before the minus sign
999999999
Run Code Online (Sandbox Code Playgroud)

请注意,在即将发布的Bash 4.2中,您可以echo ${array[-1]}获取最后一个元素.在4.2之前的版本中,负下标会出现错误的下标错误.

要获取最后一个元素的索引:

$ idx=(${!array[@]})
$ echo ${idx[@]: -1}
9
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

$ last=${idx[@]: -1}
$ echo ${array[last]}
999999999
Run Code Online (Sandbox Code Playgroud)

迭代稀疏数组:

for idx in ${!array[@]}
do
    something_with ${array[idx]}
done
Run Code Online (Sandbox Code Playgroud)

*我建议避免 nounset


Ign*_*ams 14

wc可以告诉你变量中有多少个字符和字节,而bash本身可以告诉你数组中有多少个元素.如果您正在寻找的是bash的内部结构对于保存特定变量有多大,那么我不相信它可以在任何地方使用.

$ foo=42
$ bar=(1 2 3 4)
$ echo -n "$foo" | wc -c -m
      2       2
$ echo "${#bar[@]}"
4
Run Code Online (Sandbox Code Playgroud)