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_one
및 list_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
값의 공백을 처리해야 하지만 빈 요소는 제거됩니다.