Array

tcsh:在整個數組中搜尋變數

  • August 24, 2019

我正在修改一套用 tcsh 編寫的腳本。不幸的是,這些腳本無法重寫,因為它們與之互動的程序也是用 tcsh 編寫的。我只是想擺脫這樣的想法,即如果我可以用 BASH 或任何其他語言重寫這些,我會的。

作為這些腳本的一部分,我們的許多變數都保存在數組中。我的問題是:在 tcsh 中有沒有一種方法可以在不使用循環的情況下查詢變數的內容是否存在於數組中(無論它在數組中的位置如何)?

例如,我有以下有效 ROI 名稱數組:

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

當使用者執行腳本時,他們可以選擇使用一個標誌來表示他們想要對上述選項中的一個或多個特定ROI 進行重做處理。就像,如果標誌是-remake_ROI,作為呼叫腳本的一部分,他們只能添加-remake_ROI lAmy-remake_ROI lAmy A32p_重新製作這些 ROI。我有一個非常大的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[*]" )的東西可以完成工作,而不是許多循環。

感謝任何人的幫助。

if (" $shortROI " =~ *" $argv[$ac] "*)
  ...
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
       ...

引用自:https://unix.stackexchange.com/questions/537164