foreach 遍历存储在变量中的匹配条件

foreach 遍历存储在变量中的匹配条件

我使用 foreach 检索与 a_condition* 匹配的子文件夹名称,以下工作正常:

foreach i (a_condition*)
    echo $i
end

它将打印 a_condition1 a_condition2 ...

但是当我尝试不硬编码 a_conditon* 时,例如:

set condition = a_condition*
foreach i ($condition)
   echo $i
end

它只会打印第一个值,为什么会发生这种情况?

答案1

csh在我所知道的所有实现/版本中:

set condition = a_condition*

是相同的:

set condition = (a_condition*)

也就是说,它创建一个包含因 glob 扩展而产生的所有文件名的数组a_condition*。我在 PDP11 模拟器上检查了 2BSD 中 1979 年的原始csh实现,结果是一样的。

您描述的行为看起来好像该行被解释为

set condition = a_condition1 a_condition2 a_condition3...

也就是说,定义condition一个带有 value 的变量a_condition1和一个名为 的变量a_condition2,然后一个名为a_condition3... 我不知道有任何csh实现具有类似的行为,并且我发现这样的实现不太可能存在,因为原始实现没有' t,但如果是这样,你可以尝试这样做:

set condition = (a_condition*)

看看这是否有影响。这也将更加自我描述。

无论如何,如果您确实希望在赋值时扩展该 glob 并让循环遍历元素,则语法应为:

set condition = (a_condition*)
foreach i ($condition:q)
  echo $i:q
end

如果你想condition包含a_condition* 细绳,并且该字符串在循环时扩展为 glob,即:

set condition = 'a_condition*'
foreach i ($condition)
  echo $i:q
end

相关内容