csh:设置:没有匹配项

时间:2018-09-16 06:46:26

标签: sed csh command-substitution

我定义了一个函数,一个数组和一个变量:

set fnctn = "F(x)=Vx1*(1+cos(1*x-pi))"  
set Vx = ( 1 1 1 1 )  
set Vx1 = $Vx[1]  

以下命令可以满足我的要求:

echo "$fnctn" | sed "s/Vx1/$Vx1/"  
set fnctn2 = `echo "$fnctn" | sed "s/Vx1/$Vx1/"`   
echo "$fnctn2"  

甚至:

echo "$fnctn" | sed "s/Vx1/$Vx[1]/"  

但是将后面命令的答案存储在变量中,例如:

set fnctn2 = `echo "$fnctn" | sed "s/Vx1/$Vx[1]/"` 

报告以下错误消息:

set: No match.  

诀窍在哪里?

ps:请不要建议我切换到bash :-)-

2 个答案:

答案 0 :(得分:0)

由于set noglob 被放在方括号中,因此将该词解释为一种模式,并尝试对其进行文件名替换(“ globbing”)。由于您没有任何文件名与该“模式”相匹配,因此它告诉您找不到匹配项。

只需禁止这样的文件名替换:

body-parser

尝试分配之前。

答案 1 :(得分:0)

这里要注意的是,对于$Vx[1],出于某种原因尝试进行文件名替换两次 :显然,首先是对变量求值,然后对命令结果求值代换。对于$Vx1而言,它仅在变量替换上尝试一次:

> ls
f1 f2 f3
> echo *
f1 f2 f3
> set v=("*" "?2")
> set v1="$v[1]"
> set echo=1

> echo `echo ${v1}`
echo `echo ${v1}`
echo *
f1 f2 f3
> echo `echo "${v1}"`
echo `echo "${v1}"`
echo *
*
> echo "${v[1]}"
echo *
*
> echo `echo "${v[1]}"`
echo `echo "${v[1]}"`
echo *
f1 f2 f3

我对原因的猜测是因为数组索引也是变量替换的对象,$Vx[1]被标记为“两次替换”或类似内容,并且结果“ *”具有“还剩下一个替换” 。 The man page并没有说明任何相关内容,因此,如果是设计使然,则该链接对我来说太微妙了。尽管这绝对是现有实现的副作用,无论它是什么。这是我书中的错误-至少没有记录这种行为。


我发现的解决方法是引用命令替换子句。现在,用反斜杠转义内部的引号无法可靠地工作,并且容易产生解析错误,具体取决于内部的表达式。在这种情况下,对我有用的方法是在其中使用单引号:

> echo "`echo '$fnctn' | sed 's/Vx1/$Vx[1]/'`"
echo `echo 'F(x)=Vx1*(1+cos(1*x-pi))' | sed 's/Vx1/1/'`
sed s/Vx1/1/
echo F(x)=Vx1*(1+cos(1*x-pi))
F(x)=1*(1+cos(1*x-pi))

这只是examples of csh's poor/unpolished design that causes people to recommend against using it之一。