我正在修改一套用 tcsh 编写的脚本。不幸的是,这些脚本无法重写,因为它们所连接的程序也是用 tcsh 编写的。我只是想摆脱这样的想法:如果我可以用 BASH 或任何其他语言重写这些,我会的。
作为这些脚本的一部分,我们的许多变量都保存在数组中。我的问题是: tcsh 中有没有一种方法可以在不使用循环的情况下查询变量的内容是否存在于数组中(无论其在数组中的位置如何)?
例如,我有以下有效 ROI 名称数组:
set shortROI = {"lAmy_","mAmy_","A32p_","A32sg_"}
当用户执行脚本时,他们可以选择使用一个标志来表示他们想要重做一个或多个处理具体的上述选项的投资回报率。就像,如果标志是-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[*]" )
可以完成工作,而不是有很多循环。
感谢任何人的帮助。
答案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
...