Array dan loop di zsh

9

Saya mencoba mempelajari loop dan manipulasi array zsh.

Katakanlah saya memiliki dua array di zsh dengan # elemen yang tidak diketahui sama dan masing-masing mengandung daftar jalur, misalnya

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

Saya ingin beralih melalui kedua array secara bersamaan dengan indeks umum, sehingga saya dapat melakukan sesuatu seperti:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

di setiap iterasi. Bagaimana saya bisa melakukan ini di zsh?

Juga, saya telah mencari kontrol lingkaran dan array dalam dokumentasi zsh tetapi sedikit berhasil. Apakah ada tutorial bagus yang memperkenalkan dasar-dasar loop , array , dll di zsh? Sesuatu untuk orang dengan sedikit pengalaman bash atau scripting shell tetapi dengan latar belakang dalam pemrograman?

Amelio Vazquez-Reina
sumber

Jawaban:

13

Bagian 15.2.1 "Array Subscript" mengatakan bahwa array dapat diindeks dengan [exp](di mana expadalah ekspresi numerik) dan elemen-elemen tersebut dimulai pada indeks 1 (0 jika KSH_ARRAYSdiatur).

Bagian 14.3 "Ekspansi Parameter" mengatakan bahwa sintaks ${#array_name}akan diperluas ke jumlah elemen array.

Bagian 6.3 “Kompleks Perintah” memberikan sintaks untuk numerik forlingkaran (seperti dalam C):
for (( initExpr ; testExpr ; stepExpr )) do … done.

Menyatukan semuanya:

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

Atau, jika Anda menggunakan KSH_ARRAYS, maka ini:

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

Menggunakan KSH_ARRAYSmake array dimulai dengan indeks 0, membutuhkan penggunaan kawat gigi untuk ekspresi array, dan diartikan $arraysebagai $array[0](membutuhkan perubahan pada ekspresi panjang array). Perubahan sintaks yang diperlukan oleh KSH_ARRAYjuga akan berfungsi tanpa KSH_ARRAY, tetapi Anda masih harus menyesuaikan logika untuk rentang indeks yang berbeda (1 hingga N versus 0 hingga N-1).

Chris Johnsen
sumber