在 zsh 脚本中查找数组长度

Cri*_*ano 6 bash zsh shell-script bash-array

有没有办法*在 zsh 中查找数组(文件名)的长度,而不使用 for 循环来增加某些变量?

我天真地尝试过,echo ${#*[@]} 但没有成功。(也欢迎 bash 语法)

Sté*_*las 6

${#*[@]}$*数组的长度,也称为$@or $argv,它是位置参数的数组(在脚本或函数的情况下,这是脚本或函数接收的参数)。虽然你宁愿用$#它。

*alone 只是一个全局模式。在列表上下文中,它会扩展到当前目录中与该模式匹配的文件列表。作为*匹配任何字符串的模式,它将扩展到当前目录中的所有文件名(隐藏文件除外)。

现在您需要找到要扩展的列表上下文*,然后以某种方式计算结果参数的数量。一种方法是使用匿名函数:

() {echo There are $# non hidden files in the current directory} *(N)
Run Code Online (Sandbox Code Playgroud)

*我没有使用*(N)which is *but 与N(对于 nullglob)通配限定符,这使得如果*模式与任何文件不匹配,它不会报告错误,而是扩展到任何内容。

然后将的扩展*(N)传递给该匿名函数。在该匿名函数中,该文件列表在$@/$argv数组中可用,我们可以使用该数组的长度$#(与$#argv, $#@$#*甚至像 一样尴尬的 ksh 语法${#argv[@]})。


Jef*_*ler 5

files=(*)
printf 'There are %d files\n' "${#files[@]}"
Run Code Online (Sandbox Code Playgroud)

或者

set -- *
printf 'There are %d files\n' "$#"
Run Code Online (Sandbox Code Playgroud)

您必须首先命名该数组(就像我上面使用 所做的那样),或者通过使用通配符填充它来files使用内置数组,就像我在第二个示例中所做的那样。$@在前者中,数组的“长度”(文件数)是通过${#arrayname[@]}语法完成的。内置数组中的元素数量为$#