我定义了一个函数、一个数组和一个变量:
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. 诀窍在哪里?
注:请不要建议我切换到bash :-) -
发布于 2018-09-17 04:33:20
由于方括号的存在,csh将该单词解释为模式,并尝试对其执行文件名替换("globbing")。由于您没有任何名称与该“模式”匹配的文件,它会告诉您无法找到匹配的文件。
只需像这样禁止文件名替换:
set noglob在你尝试分配之前。
发布于 2018-09-17 07:24:07
这里的问题是,对于$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中的一个。
https://stackoverflow.com/questions/52351678
复制相似问题