Arrays und Loops in zsh

9

Ich versuche, Loops und Array-Manipulation in zu lernen zsh.

Angenommen, ich habe zwei Arrays in zsh mit derselben unbekannten Anzahl von Elementen, von denen jedes eine Liste von Pfaden enthält, z

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

Ich möchte beide Arrays gleichzeitig mit einem gemeinsamen Index durchlaufen, damit ich Folgendes tun kann:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

in jeder Iteration. Wie kann ich das in zsh machen?

Außerdem habe ich in der zsh-Dokumentation nach Schleifensteuerung und Arrays gesucht, aber wenig Erfolg gehabt. Gibt es ein gutes Tutorial , das die Grundlagen von Schleifen , Arrays usw. in zsh einführt ? Etwas für Leute mit wenig Bash- oder Shell-Scripting-Erfahrung, aber mit Programmierhintergrund?

Amelio Vazquez-Reina
quelle

Antworten:

13

In Abschnitt 15.2.1 „Array-Indizes“ heißt es, dass Arrays indexiert werden können [exp](wobei expes sich um einen numerischen Ausdruck handelt) und dass Elemente bei Index 1 beginnen (0, wenn KSH_ARRAYSfestgelegt).

In Abschnitt 14.3 „Parametererweiterung“ heißt es, dass die Syntax ${#array_name}auf die Anzahl der Elemente eines Arrays erweitert wird.

Abschnitt 6.3 „Komplexe Befehle“ enthält die Syntax für eine numerische forSchleife (wie in C) :
for (( initExpr ; testExpr ; stepExpr )) do … done.

Alles zusammenfügen:

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

Oder, wenn Sie verwenden KSH_ARRAYS, dann dies:

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

Die Verwendung von KSH_ARRAYSmake-Arrays beginnt mit dem Index 0, erfordert die Verwendung von geschweiften Klammern für Array-Ausdrücke und interpretiert $arrayals $array[0](erfordert eine Änderung des Ausdrucks für die Array-Länge). Die von erforderlichen KSH_ARRAYSyntaxänderungen funktionieren auch ohne KSH_ARRAY, aber Sie müssen die Logik für den unterschiedlichen Indexbereich (1 bis N gegenüber 0 bis N-1) anpassen.

Chris Johnsen
quelle