foreach는 변수에 저장된 일치 조건을 반복합니다.

foreach는 변수에 저장된 일치 조건을 반복합니다.

foreach를 사용하여 a_condition*과 일치하는 하위 폴더 이름을 검색하면 다음이 정상적으로 작동합니다.

foreach i (a_condition*)
    echo $i
end

a_condition1 a_condition2...를 인쇄합니다.

하지만 a_conditon*을 하드코딩하지 않고 시도하면 다음과 같습니다.

set condition = a_condition*
foreach i ($condition)
   echo $i
end

첫 번째 값만 인쇄합니다. 왜 이런 일이 발생합니까?

답변1

csh내가 알고 있는 모든 구현/버전에서:

set condition = a_condition*

동일합니다:

set condition = (a_condition*)

즉, glob 확장으로 인한 모든 파일 이름을 포함하는 배열을 생성합니다 a_condition*. PDP11 에뮬레이터의 2BSD에서 원래 1979년 구현을 확인했는데 csh결과는 동일했습니다.

당신이 설명하는 동작은 라인이 다음과 같이 해석되는 것처럼 보입니다.

set condition = a_condition1 a_condition2 a_condition3...

즉, condition값이 있는 변수 와 a_condition1이름이 지정된 변수를 a_condition2정의 합니다 a_condition3. 유사한 동작을 갖는 구현을 인식하지 못하며 csh원래 구현과 같이 그러한 구현이 존재할 가능성이 거의 없습니다. 아니요, 그렇다면 시도해 볼 수 있습니다. 이것:

set condition = (a_condition*)

이것이 변화를 가져오는지 확인하세요. 이것은 또한 더 자기 설명적일 것입니다.

어쨌든 할당 시 글로브를 확장하고 루프가 요소를 반복하도록 하려면 구문은 다음과 같습니다.

set condition = (a_condition*)
foreach i ($condition:q)
  echo $i:q
end

condition포함하고 싶다면a_condition* , 그리고 문자열은 반복하는 동안 glob으로 확장됩니다. 즉:

set condition = 'a_condition*'
foreach i ($condition)
  echo $i:q
end

관련 정보