zsh 中的数组和循环

zsh 中的数组和循环

我正在尝试学习循环和数组操作zsh

假设我在 zsh 中有两个相同的数组未知# 个元素,每个元素都包含一个路径列表,例如

LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3)
REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3)

我想使用公共索引同时迭代两个数组,这样我就可以执行以下操作:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

在每次迭代中。我怎样才能在 zsh 中做到这一点?

另外,我在中搜索了循环控制和数组zsh 文档但收效甚微。有没有好的教程介绍了基础知识循环,数组等在zsh中?适合那些没有 bash 或 shell 脚本经验但有编程背景的人吗?

答案1

部分15.2.1“数组下标”表示数组可以作为索引[exp](其中exp是数值表达式),并且元素从索引 1 开始(如果KSH_ARRAYS已设置,则为 0)。

部分14.3“参数扩展”表示语法${#array_name}将扩展到数组元素的数量。

部分6.3“复杂命令”给出数字循环的语法for(如 C 语言):
for (( initExpr ; testExpr ; stepExpr )) do … done.

把它们放在一起:

for (( i = 1; i <= $#LOCAL_PATH; i++ )) do
    ( # subshell to contain the effect of the chdir
        cd $LOCAL_PATH[i]
        hg pull $REMOTE_PATH[i]
    )
done

或者,如果您正在使用KSH_ARRAYS,那么:

for (( i = 0; i < ${#LOCAL_PATH[@]}; i++ )) do
    ( # subshell to contain the effect of the chdir
        cd ${LOCAL_PATH[i]}
        hg pull ${REMOTE_PATH[i]}
    )
done

使用KSH_ARRAYS使数组从索引 0 开始,需要对数组表达式使用大括号,并解释$array$array[0](需要更改数组长度表达式)。所需的语法更改在KSH_ARRAY没有 的情况下也可以工作KSH_ARRAY,但您仍然需要调整不同索引范围(1 到 N 与 0 到 N-1)的逻辑。

答案2

你可以压缩两个数组并使用两个变量循环它们,例如:

LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3)
REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3)

for local remote (${LOCAL_ARRAY:^REMOTE_ARRAY}) (
  cd $local &&
   hg pull $remote
)

答案3

如果您可以控制这两个数组,您还可以将它们组合成一个关联的数组(想想 Ruby/Perl 中的“hash”、C++ 中的“map”、Java 中的“HashMap”或 Python 中的“dict”):

typeset -A remotes
remotes=(
  local1 remote1
  local2 remote2
)

for local remote in "${(@kv)remotes}"  # (kv) means key and value
                                       # and (@) within quotes is to
                                       # preserve empty ones (in your
                                       # case ${(kv)remotes} would be
                                       # enough as file paths are not
                                       # meant to be empty).
do
    (
        cd $local &&
          hg pull $remote
    )
done

注意:语法突出显示可能会产生误导。

相关内容