我使用 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