我定义了一个函数,一个数组和一个变量:
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 :-)-
答案 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之一。