我正在尝试学习循环和数组操作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
注意:语法突出显示可能会产生误导。