Arrays Bash与Zsh:一个带有示例的数组问题

Arrays Bash与Zsh:一个带有示例的数组问题,arrays,bash,zsh,Arrays,Bash,Zsh,下面是一个在Bash中工作但在Zsh中不工作的数组示例。有人能解释一下为什么它失败了,以及Zsh的合适语法是什么来获得相同的结果吗 我知道bash是索引0,Zsh是索引1,但我不明白这在上下文中是如何应用的 #!/bin/bash USER_LIST=$( ls /Users | grep -v -e 'Shared' -e 'Guest' ) for TARGET_USER in "${USER_LIST[@]}"; do TARGET_FILE="/Users/${TARGET_U

下面是一个在Bash中工作但在Zsh中不工作的数组示例。有人能解释一下为什么它失败了,以及Zsh的合适语法是什么来获得相同的结果吗

我知道bash是索引0,Zsh是索引1,但我不明白这在上下文中是如何应用的

#!/bin/bash
USER_LIST=$( ls /Users | grep -v -e 'Shared' -e 'Guest' )

for TARGET_USER in "${USER_LIST[@]}"; do
    TARGET_FILE="/Users/${TARGET_USER}/Library/Application Support/foo/example.txt"
    if [[ -e "$TARGET_FILE" ]]; then
        echo "The file '$TARGET_FILE' exists for user '$TARGET_USER'. It will be deleted now..."
        rm -f "$TARGET_FILE"
    else
         echo "The file '$TARGET_FILE' does NOT exist for user '$TARGET_USER'. No action required."
    fi
done

使用glob定义数组

# bash
shopt -s extglob
USER_LIST=( /Users/!(Shared|Guest) )
USER_LIST=( "${USER_LIST[@]#/Users/}" )

# zsh
setopt kshglob
USER_LIST=( /Users/!(Shared|Guest) )
USER_LIST=($USER_LIST:t)

这实际上不是一个数组;这是一个多字字符串。数组需要一组额外的括号:
USER\u LIST=($(ls/Users-grep-v-e'Shared'-e'Guest')
显然,当变量是字符串而不是数组时,bash忽略了
[@]
,这就是它在那里工作的原因。因为bash和Zsh不兼容。@JohnKugelman:虽然你说的是正确的,但是考虑到这里发布的具体代码,我仍然看不出
bash
zsh
之间的区别会在哪一点出现。当然,索引将是一个候选变量,特别是当变量不是数组而是标量时,正如您正确指出的,但在这段代码中,唯一的“索引”发生在“${USER_LIST[@]}”中的目标用户的
中,正如我尝试的那样,在bash和zsh中的行为相同。此外,循环中变量的使用似乎没有触及到与bash/zsh相关的任何语言差异。@Barmar:I did a
a=“ab”;对于“${a[@]}”中的f;不要重复$f;完成
,它在bash和zsh中的工作原理相同。在这两种情况下,循环执行一次,
f
设置为“ab”。这可能不是OP想要的,但至少bash和zsh之间的行为是一致的。这个解决方案是干净的,因为您省略了调用
ls
,但它并没有真正回答问题,也就是说,OP的代码在哪一点上与bash和zsh之间存在差异。OP声称存在差异,我无法复制。我也无法复制。我投票关闭它,理由是问题不可复制@DanielStranathan:你可以通过演示你所说的bash和zsh之间的区别来修正你的问题,我会重新开始。