Массивы и циклы в зш


9

Я пытаюсь изучить циклы и манипуляции с массивами в zsh.

Скажем, у меня есть два массива в zsh с одним и тем же неизвестным количеством элементов, и каждый из них содержит список путей, например

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

Я хотел бы перебрать оба массива одновременно с общим индексом, чтобы я мог сделать что-то вроде:

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

в каждой итерации. Как я могу сделать это в Zsh?

Кроме того, я искал управление циклом и массивы в документации по zsh, но безуспешно. Есть хороший учебник, который знакомит с основами циклов , массивов и т. Д. В Zsh? Что-то для людей с небольшим опытом работы с bash или shell-скриптингом, но с опытом работы в программировании?

Ответы:


13

В разделе 15.2.1 «Подписки на массивы » говорится, что массивы могут индексироваться с помощью [exp](где expчисловое выражение) и что элементы начинаются с индекса 1 (0, если KSH_ARRAYSустановлено).

Раздел 14.3 «Расширение параметров» говорит, что синтаксис ${#array_name}будет расширен до количества элементов в массиве.

Раздел 6.3 «Комплексные команды» дает синтаксис для числового forцикла (как в C):
for (( initExpr ; testExpr ; stepExpr )) do … done.

Собираем их все вместе:

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

Или, если вы используете KSH_ARRAYS, то это:

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

Использование KSH_ARRAYSзаставляет массивы начинаться с индекса 0, требует использования фигурных скобок для выражений массива и интерпретирует $arrayкак $array[0](требующее изменения выражения длины массива). Изменения синтаксиса, необходимые для KSH_ARRAY, также будут работать без KSH_ARRAY, но вам все равно придется настроить логику для другого диапазона индекса (от 1 до N против 0 до N-1).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.