![在 zsh 脚本中查找数组长度](https://linux22.com/image/147863/%E5%9C%A8%20zsh%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E7%BB%84%E9%95%BF%E5%BA%A6.png)
有没有办法在 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[@]}
。内置数组中的元素数量为$#
。