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
...