[英]In a shell script that stores a list of files under a directory, the result values of zsh and bash are different
zsh的shell脚本output值和bash不一样。
这是一个 shell 脚本,它将文件列表存储在数组中的特定目录下。
#!/bin/bash
target_dir="/path/"
list=($( ls ${target_dir} ))
echo ${#list}
output: 16
#!/bin/zsh
target_dir="/path/"
list=($( ls ${target_dir} ))
echo ${#list}
output:4569
由 macos monterey 执行。
bash 版本:GNU bash,版本 5.1.16(1)-release (x86_64-apple-darwin21.1.0)
zsh 版本:zsh 5.8.1 (x86_64-apple-darwin21.3.0)
zsh的shell脚本output值和bash不一样。
是的, bash
和zsh
在某些领域有不同的行为,主要是那些没有被 POSIX 标准化的领域,例如 arrays。
在bash
中,如果您在不指定索引的情况下展开一个数组值参数,那么您将获得索引 0 处的元素,就好像您说的是${an_array[0]}
。 相应地, ${#an_array}
给你元素 0 的长度。如果你想将数组扩展到它的所有元素,那就是${an_array[*]}
或${an_array[@]}
,如果你想要元素的数量就是${#an_array[*]}
或${#an_array[@]}
。
在 zsh中,默认情况下,如果您在不指定索引的情况下扩展数组值参数,那么它等效于扩展${an_array[*]}
,并且相应地, ${#an_array}
为您提供该扩展的长度。
您可以在 zsh 中设置KSH_ARRAYS
选项,使其在这些方面的行为类似于ksh
的行为,这与bash
的行为相同,但为此目的最好避免简单的${an_array}
和相关的 forms,特别是,当您想要确定数组中元素的数量时使用${#an_array[@]}
。 这在 zsh 和 bash 中应该是一样的。
作为一个单独的问题,并且如评论中所述,不要尝试以编程方式解析ls
的 output。 它仅供人类使用,并且存在歧义,因此很难在所有情况下正确解析。 另外,globbing 更易于编写并且没有这些歧义。 具体来说:
list=("${target_dir}"/*)
当 shell 扩展 shell 这样的模式时(在扩展参数引用之后并与扩展参数引用分开),每个匹配的文件名都会扩展为一个单词,而不管它包含的字符是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.