Tableaux et boucles en zsh

9

J'essaie d'apprendre les boucles et la manipulation des tableaux dans zsh.

Disons que j'ai deux tableaux en zsh avec le même nombre inconnu d'éléments et chacun d'eux contenant une liste de chemins, par exemple

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

Je voudrais parcourir les deux tableaux simultanément avec un index commun, afin de pouvoir faire quelque chose comme:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

à chaque itération. Comment puis-je faire cela dans zsh?

J'ai également recherché le contrôle de boucle et les tableaux dans la documentation de zsh, mais j'ai eu peu de succès. Existe-t-il un bon tutoriel qui présente les bases des boucles , des tableaux , etc. dans zsh? Quelque chose pour les gens avec peu d'expérience bash ou de script shell mais avec une formation en programmation?

Amelio Vazquez-Reina
la source

Réponses:

13

La section 15.2.1 «Array Subscripts» indique que les tableaux peuvent être indexés avec [exp](où expest une expression numérique) et que les éléments commencent à l'index 1 (0 si KSH_ARRAYSest défini).

La section 14.3 «Extension des paramètres» indique que la syntaxe ${#array_name}s'étendra au nombre d'éléments d'un tableau.

Section 6.3 « Commandes complexes » donne la syntaxe pour une numérique en forboucle (comme en C):
for (( initExpr ; testExpr ; stepExpr )) do … done.

Les rassembler tous:

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, si vous utilisez KSH_ARRAYS, alors ceci:

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

L'utilisation KSH_ARRAYSfait en sorte que les tableaux commencent par l'index 0, nécessite l'utilisation d'accolades pour les expressions de tableau et interprète $arraycomme $array[0](nécessitant une modification de l'expression de longueur du tableau). Les changements de syntaxe requis par KSH_ARRAYfonctionneront également sans KSH_ARRAY, mais vous devez toujours ajuster la logique pour les différentes plages d'index (1 à N contre 0 à N-1).

Chris Johnsen
la source