TCSH 쉘에서 배열 루프 사용

TCSH 쉘에서 배열 루프 사용

TCSH에서:

서로 다른 파일이 포함된 두 개의 목록이 제공됩니다. 그런 다음 이 목록을 배열 요소로 전달해야 하며 목록이 2개만 있으므로 루프를 두 번 실행해야 합니다. 하지만 이 경우 루프를 실행하는 데 두 목록의 파일만큼 오랜 시간이 걸립니다.

set list_one = (one.s two.s three.s)
set list_two = (four.s five.s)

set arr=($list_one $list_two)

foreach i ($arr)
cat $i > $output.s
end

여기 제 코드 샘플이 있습니다. 제 생각에는 루프가 두 번만 실행되어야 하지만(for list_onelist_two) 다섯 번 실행됩니다(for one.s two.s three.s four.s five.s).

답변1

이 작업은 set arr=($list_one $list_two)목록을 하나로 병합합니다.

여기서 무엇을 찾고 있는지 잘 모르겠지만 다음을 사용하여 목록 이름을 반복할 수 있습니다.

set names=(list_one list_two)

foreach i ($names)
    echo $i
end

그러나 변수에 처음 두 목록의 이름이 있으면 거기에서 처음 두 목록을 실제로 사용하는 것이 더 까다로워 보입니다. tcsh가 간접 변수 참조(경유 제외)를 지원하는지 여부를 찾을 수 없습니다 eval. 이와 같은 것이 작동하는 것처럼 보이지만 평가에서 올바르게 인용하는 것은 까다로워 보입니다.

#!/usr/bin/tcsh
set l1 = (aa bb cc)
set l2 = (dd ee)
set names = (l1 l2)

foreach i ($names)
    eval set x = \(\$$i\)
    foreach j ($x)
        echo $i $j
    end
end

그런데 공백이 포함된 값이 분할되어 있는데 이 문제를 어떻게 해결해야 할지 모르겠습니다.


솔직히 저는 Tcsh를 버리고 Zsh에서도 같은 작업을 수행합니다.

l1=(aa bb cc)
l2=(cc dd)
names=(l1 l2)

for i in $names; do
    for j in ${(P)i}; do
        echo $i $j
    done
done

값의 공백을 처리해야 하지만 빈 요소는 제거됩니다.

관련 정보