루프와 배열 연산을 배우려고 합니다 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
참고: 구문 강조 표시는 오해의 소지가 있을 수 있습니다.