Arrays e loops no zsh

8

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

Digamos que eu tenha duas matrizes em zsh com o mesmo desconhecido # 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)

Eu 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 em 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 as noções básicas de loops , arrays , etc. em zsh? Algo para pessoas com pouca experiência bash ou shell-scripting, mas com experiência em programação?

    
por Amelio Vazquez-Reina 19.10.2011 / 19:59

1 resposta

13

Seção 15.2.1 “Array Subscripts” diz que arrays podem ser indexados com [exp] (onde exp é uma expressão numérica) e que os elementos iniciam no índice 1 (0 se KSH_ARRAYS estiver definido).

Seção 14.3 "Expansão de Parâmetro" diz que a sintaxe ${#array_name} será expandida para o número de elementos de um array.

Seção 6.3 “Comandos Complexos” fornece a sintaxe de uma% numéricafor loop (como em C): for (( initExpr ; testExpr ; stepExpr )) do … done .

Colocando todos juntos:

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:

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

Usar KSH_ARRAYS faz as matrizes começarem com o índice 0, requer o uso de chaves para expressões de matriz e interpreta $array as $array[0] (exigindo uma alteração na expressão de comprimento da matriz). As alterações de sintaxe exigidas por KSH_ARRAY també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).

    
por 20.10.2011 / 04:34

Tags