tcsh: 전체 배열에서 변수 검색

tcsh: 전체 배열에서 변수 검색

tcsh로 작성된 스크립트 세트를 수정하고 있습니다. 불행하게도 이러한 스크립트는 연결된 프로그램도 tcsh로 작성되었기 때문에 다시 작성할 수 없습니다. BASH나 다른 언어로 다시 작성할 수 있다면 그렇게 할 것이라는 생각을 없애고 싶습니다.

이러한 스크립트의 일부로 많은 변수가 배열에 보관됩니다. 내 질문은: tcsh에서 루프를 사용하지 않고 변수의 내용이 배열의 위치에 관계없이 배열에 있는지 여부를 쿼리하는 방법이 있습니까?

예를 들어 다음과 같은 유효한 ROI 이름 배열이 있습니다.

set shortROI = {"lAmy_","mAmy_","A32p_","A32sg_"}

사용자가 스크립트를 실행할 때 선택적으로 플래그를 사용하여 하나 이상의 프로세스를 다시 실행하고 싶다는 것을 나타낼 수 있습니다.특정한위 옵션에 대한 ROI. 마찬가지로 플래그가 -remake_ROI호출 스크립트의 일부로 해당 ROI를 추가 -remake_ROI lAmy하거나 -remake_ROI lAmy A32p_다시 만들 수 있습니다. 현재 while가능한 모든 플래그를 처리하는 매우 큰 루프가 있지만 여기서 관련 부분은 다음과 같습니다.

set ac = 1
set redo_rois  = 0
set roi_proc_list = 

        while ( $ac <= $#argv )
        foreach roi_opt ( $shortROI )
            if ( "$argv[$ac]" == $roi_opt )
                @ redo_rois ++
                set roi_proc_list = ( $roi_proc_list $roi_opts )
            endif
        end
        @ ac ++
    end

ac는 명령줄 인수 개수, redo_rois재처리할 ROI 수, roi_proc_list다시 실행할 실제 목록입니다. if ( "$argv[$ac]" == "$shortROI[*]" )많은 루프 없이 작업을 완료할 수 있는 비슷한 것이 있는지 궁금합니다 .

누구의 도움에도 감사드립니다.

답변1

if ( " $shortROI " =~ *" $argv[$ac] "* ) then
   ...
endif

예:

set list = (foo bar baz)

foreach a ($*)
        if(" $list " =~ *" $a "*) then
                echo "$a in list"
        else
                echo "$a NOT in list"
        endif
end

오른쪽 변수나 목록의 단어에 공백이 포함된 경우 true가 잘못 반환될 수 있습니다. 양쪽에 나타날 수 없는 문자(예 @: )를 결정할 수 있는 경우 각 단어의 공백을 해당 문자로 바꿀 수 있습니다.

foreach a ($*:q)
        if(" $list:q:gas/ /@/ " =~ *" $a:q:as/ /@/ "*) then
        ...

관련 정보