zsh의 배열과 루프

zsh의 배열과 루프

루프와 배열 연산을 배우려고 합니다 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 스크립팅 경험은 없지만 프로그래밍 배경 지식이 있는 사람들에게 적합합니까?

답변1

부분15.2.1 "배열 첨자화"배열을 인덱스로 사용할 수 있으며 [exp](여기서 exp는 숫자 표현식) 요소가 인덱스 1( KSH_ARRAYS또는 설정된 경우 0)에서 시작함을 나타냅니다.

부분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)에 대한 논리를 조정해야 합니다.

답변2

당신은 할 수압축두 개의 배열을 만들고 두 개의 변수를 사용하여 반복합니다. 예를 들면 다음과 같습니다.

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

for local remote (${LOCAL_ARRAY:^REMOTE_ARRAY}) (
  cd $local &&
   hg pull $remote
)

답변3

두 배열을 제어할 수 있는 경우 이를 연관 배열(Ruby/Perl의 "hash", C++의 "map", Java의 "HashMap" 또는 "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

참고: 구문 강조 표시는 오해의 소지가 있을 수 있습니다.

관련 정보