首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >csh: set:不匹配

csh: set:不匹配
EN

Stack Overflow用户
提问于 2018-09-16 14:46:26
回答 2查看 1.6K关注 0票数 1

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

代码语言:javascript
复制
set fnctn = "F(x)=Vx1*(1+cos(1*x-pi))"  
set Vx = ( 1 1 1 1 )  
set Vx1 = $Vx[1]  

以下命令可以执行我想要的操作:

代码语言:javascript
复制
echo "$fnctn" | sed "s/Vx1/$Vx1/"  
set fnctn2 = `echo "$fnctn" | sed "s/Vx1/$Vx1/"`   
echo "$fnctn2"  

或者甚至是:

代码语言:javascript
复制
echo "$fnctn" | sed "s/Vx1/$Vx[1]/"  

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

代码语言:javascript
复制
set fnctn2 = `echo "$fnctn" | sed "s/Vx1/$Vx[1]/"` 

报告以下错误消息:

代码语言:javascript
复制
set: No match.  

诀窍在哪里?

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-17 04:33:20

由于方括号的存在,csh将该单词解释为模式,并尝试对其执行文件名替换("globbing")。由于您没有任何名称与该“模式”匹配的文件,它会告诉您无法找到匹配的文件。

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

代码语言:javascript
复制
set noglob

在你尝试分配之前。

票数 1
EN

Stack Overflow用户

发布于 2018-09-17 07:24:07

这里的问题是,对于$Vx[1],由于某种原因,文件名替换尝试了两次:显然,第一次是在评估变量时,然后是在评估命令替换的结果时。而对于$Vx1,它只尝试一次,在变量替换时:

代码语言:javascript
复制
> 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没有说任何相关的东西,所以如果这是故意的,那么这个链接对我来说太微妙了。尽管这绝对是现有实现的一个副作用,无论它是什么。这是我书中的一个错误--至少,这个行为没有被记录下来。

我发现的方法是引用命令替换子句。现在,使用反斜杠转义内部的引号并不可靠,而且根据内部表达式的不同,很容易出现解析错误。在这种情况下,我的工作方式是在内部使用单引号:

代码语言:javascript
复制
> 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中的一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52351678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档