繁体   English   中英

一个存放目录下文件列表的shell脚本中,zsh和bash的结果值不同

[英]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不一样。

是的, bashzsh在某些领域有不同的行为,主要是那些没有被 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM