在 TCSH shell 中使用数组循环

在 TCSH shell 中使用数组循环

在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_onelist_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

这应该处理值中的空格,但会删除空元素。

相关内容