在TCSH中:
我给出了两个包含不同文件的列表。然后我必须将这些列表作为数组元素传递,然后循环应该执行两次,因为只有 2 个列表。但在这种情况下,循环执行的时间与两个列表中的文件的执行时间一样长。
set list_one = (one.s two.s three.s)
set list_two = (four.s five.s)
set arr=($list_one $list_two)
foreach i ($arr)
cat $i > $output.s
end
这是我的代码示例,根据我的说法,循环应该只执行两次(forlist_one
和list_two
),但它执行了五次(for one.s two.s three.s four.s five.s
)
答案1
该作业set arr=($list_one $list_two)
将列表扁平化为一个。
我不太确定您在这里要寻找什么,但您可以使用循环遍历列表的名称
set names=(list_one list_two)
foreach i ($names)
echo $i
end
但是,在变量中包含前两个列表的名称后,从那里开始实际使用前两个列表似乎更棘手。我找不到 tcsh 是否支持间接变量引用(除了 via )eval
。像这样的东西似乎有效,但在评估中正确引用似乎很棘手:
#!/usr/bin/tcsh
set l1 = (aa bb cc)
set l2 = (dd ee)
set names = (l1 l2)
foreach i ($names)
eval set x = \(\$$i\)
foreach j ($x)
echo $i $j
end
end
但它包含空格的值被分割,我不知道如何解决这个问题。
老实说,我会放弃 Tcsh,并在例如 Zsh 中执行相同的操作:
l1=(aa bb cc)
l2=(cc dd)
names=(l1 l2)
for i in $names; do
for j in ${(P)i}; do
echo $i $j
done
done
这应该处理值中的空格,但会删除空元素。