tcsh:配列全体で変数を検索する

tcsh:配列全体で変数を検索する

tcshで書かれたスクリプトセットを修正しています。残念ながら、これらのスクリプトはリンクされたプログラムもtcshで書かれているため、再構築することはできません。 BASHや他の言語で書き直すことができれば、そうするという考えを取り除きたいと思います。

これらのスクリプトの一部として、多くの変数が配列に保持されます。私の質問は:tcshでループを使用せずに、変数の内容が配列の位置に関係なく配列にあるかどうかを照会する方法はありますか?

たとえば、次のような有効なROI名の配列があります。

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

ユーザーがスクリプトを実行すると、オプションでフラグを使用して、1 つ以上のプロセスを再実行したいことを示します。特定上記のオプションの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
        ...

関連情報