Matrizes e loops no zsh

9

Estou tentando aprender loops e manipulação de array zsh.

Digamos que eu tenha duas matrizes no zsh com o mesmo número desconhecido de elementos e cada uma delas contendo uma lista de caminhos, por exemplo,

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

Gostaria de percorrer as duas matrizes simultaneamente com um índice comum, para que eu possa fazer algo como:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

em cada iteração. Como posso fazer isso no zsh?

Além disso, procurei por controle de loop e matrizes na documentação do zsh, mas tive pouco sucesso. Existe um bom tutorial que introduz o básico de loops , matrizes etc. no zsh? Algo para pessoas com pouca experiência em bash ou em scripts de shell, mas com experiência em programação?

Amelio Vazquez-Reina
fonte

Respostas:

13

A Seção 15.2.1 “Subscripts de matriz” diz que as matrizes podem ser indexadas com [exp](onde expestá uma expressão numérica) e que os elementos começam no índice 1 (0 se KSH_ARRAYSestiver definido).

A Seção 14.3 “Expansão de parâmetros” diz que a sintaxe ${#array_name}será expandida para o número de elementos de uma matriz.

Secção 6.3 “comandos complexos” dá a sintaxe para uma numérico forciclo (como em C):
for (( initExpr ; testExpr ; stepExpr )) do … done.

Juntando todos eles:

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

Ou, se você estiver usando KSH_ARRAYS, então isto:

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

O uso de KSH_ARRAYSmake arrays começa com o índice 0, requer o uso de chaves para expressões de array e interpreta $arraycomo $array[0](exigindo uma alteração na expressão de comprimento do array). As alterações de sintaxe exigidas por KSH_ARRAYtambém funcionarão sem KSH_ARRAY, mas você ainda precisará ajustar a lógica para o intervalo de índice diferente (1 a N versus 0 a N-1).

Chris Johnsen
fonte