Массивы и циклы в zsh

Я думаю также :pwd или getcwd() то, что Вы ищете.


Только помочь запомнить вещи:

:pwd => печать рабочий каталог

getcwd() => получают текущий рабочий каталог

9
12.02.2019, 16:19
2 ответа

Разделите 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).

13
27.01.2020, 20:06

Если у вас есть контроль над двумя массивами, вы также можете объединить их в связанный массив. (подумайте о «хэше» в Ruby/Perl, «карте» в C++, «HashMap» в Java или «dict» на Питоне):

typeset -A remotes
remotes=(
  local1 remote1
  local2 remote2
)

for local remote in "${(@kv)remotes}"  # (kv) means key and value
                                       # and (@) within quotes is to
                                       # preserve empty ones (in your
                                       # case ${(kv)remotes} would be
                                       # enough as file paths are not
                                       # meant to be empty).
do
    (
        cd $local &&
          hg pull $remote
    )
done

Примечание :подсветка синтаксиса может вводить в заблуждение.

2
07.11.2020, 22:35

Теги

Похожие вопросы