在 zsh 脚本中查找数组长度

在 zsh 脚本中查找数组长度

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

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

答案1

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

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

现在你需要找到一个列出上下文以便对其*进行扩展,然后以某种方式计算结果参数的数量。一种方法是使用匿名函数:

() {echo There are $# non hidden files in the current directory} *(N)

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

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

答案2

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

或者

set -- *
printf 'There are %d files\n' "$#"

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

相关内容