csh脚本中foreach循环中的多个单词列表

3

我有一个 Cshell 脚本,我正在修改它以具有相关的输入和输出位置。所有功能都在 foreach 循环中发生,例如:

set INPUT_LOCATION_LIST = "loc1 loc2 loc3 loc4"
foreach location ($INPUT_LOCATION_LIST)
#***Do some stuff ***
end

我希望能够在foreach循环中遍历输入列表的每个值,并生成一个输出列表,输出列表的值可以与输入列表不同。这里foreach的语法非常简单。
foreach name (wordlist)

作为定义,所以只处理一个。我目前处理它的想法是让单词列表包含输入和输出位置,然后在脚本中解析出来:

set INPUT_LOCATION_LIST = "loc1;out1 loc2;out2 loc3;out3 loc4;out4"

所以我想知道是否有更好的方法来完成这个任务。


“c”标签用于与C编程语言相关的问题。“csh”虽然被命名为“C Shell”,但与C编程语言无关。我已经为您删除了该标签。 - jer
我一定是把C和shell作为单独的标签输入了,我的错误。 - mr odus
2个回答

5

您可以使用foreach迭代一个列表,通过将另一个列表视为数组并使用shift来迭代:

set INPUT_LOCATION_LIST = "loc1 loc2 loc3 loc4"
set OUT_LIST = (out1 out2 out3 out4)

foreach location ($INPUT_LOCATION_LIST)
    do_something $location $OUT_LIST[1]
    shift OUT_LIST
end

1

我通常不使用csh,但是你的问题引起了我的注意。可能有更少步骤的解决方案,但这种方法在我的版本的csh中有效:

foreach location ($INPUT_LOCATION_LIST)
    set one_word_with_space = ${location:s/;/ /}
    set loc_out = ($one_word_with_space)
    set loc = ${loc_out[1]}
    set out = ${loc_out[2]}
    ...
end

基本思路就是将分号分隔的字符串更改为以空格分隔的字符串,然后将其解析为数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接