如何在csh中用一行代码编写if-else语句?

5
我使用Cshell,并在一行中编写if else语句。
if语句成功执行,但else块陷入无限循环,无法返回提示符。
有什么建议可以解决这个问题吗?
/home/sun_cdmasee>if ( 25 == 25 )  then ; echo "yes" ; else  echo "no" ; endif

是的

还有其他吗?

还有其他吗?

还有其他吗?


1
不要使用 csh。搜索 csh considered harmful,然后使用 chsh 切换到更好的 shell,如 bashzshfish - Basile Starynkevitch
来了解更多关于tcsh的知识,并在这里分享您的见解:https://www.blogger.com/blog/posts/2001316915191381029?q=label%3Atcsh - Josef Klimuk
4个回答

10

虽然这个问题有点老,但我还是会回答它,因为这是第一个谷歌搜索结果,如果有人来找它,他们很可能会来到这里。

尽管手册中可能说这是不可能的,但是只需要使用形式相反的if语句就可以实现相同的功能:

if ("a" =~ "b") echo "wrong"; if ("a" !~ "b") echo "right"

同样的方法也可以应用于别名:

alias blabla 'if ("\!:1" =~ "bla*") echo "chat"; if ("\!:1" !~ "bla*") echo "quiet"'

是的,我用tcsh写小脚本已经十年了,因为它几乎可以用于任何事情,所以“不要在csh中编写代码”的建议应该有很多免责声明,或者更好地形成像“不要在csh中编写重要脚本”这样的建议。当它是您的shell时,因为其他shell在相关行业几乎无法得到支持,这些居高临下的回复没有任何用处。


对你最后一段话表示赞同。虽然我很感激那些评论作者的善意,但现在这并不能解决我的问题!很有可能我们之前也听过类似的建议... :) (一个使用糟糕的tcsh超过30年的用户...)附言:感谢你提供的解决方案。这个与我非常糟糕的shell相关的问题困扰了我很久! - undefined

9

man页表示这是不可能的:

(单词elseendif必须出现在输入行的开头;if必须独立于其输入行或在else之后。)

不要尝试在csh中编程。甚至不要将其用作交互式shell。

顺便说一下,您可以通过在else?提示处键入endif来退出到正常的csh提示符。


4
我的工作(电子工程)需要使用(t)csh,因此你应该在建议中注明“如果你有选择的话...”。由于EDA在SunOS上启动(csh默认),电子工程社区受限于csh。 - Myles Prather
1
成为你想在世界上看到的变化。 - rob mayoff

2
是的,你可以!在tcsh中(这在最近的Linux发行版中普遍可用,甚至在MacOS上也是如此
if ( $?debug_log ) echo "verbose output for debugging purposes ${shell_variable}"

你能否给出一个在tcsh中的例子,它不仅检查变量是否存在,而且像提问者所说的那样(如果“1”==“1”)做更多的事情?或者这不可能吗? - Leo Simon

1
注意:您可以通过键入“endif”来退出无限循环。
  • if several tests needed, can avoid opposite test

  • ";" "if" separator can be replaced by "&&"

  • for more than one command to execute, use eval to do it

  • for direct comparison, can use "==" :

    alias ggg 'if(\!:1 == bla)  eval "echo 'a'; echo 'x'"  ; if(\!:1 == xxx) eval "echo 'b' ; echo 'c'"'
    for wildcards, use "=~" :
       alias ggg 'if(\!:1 =~ "bla*")  eval "echo 'a'; echo 'x'"  ; if(\!:1 =~ "xxx*") eval "echo 'b' ; echo 'c'"'
    
  • for conditional operators, use "((" and "))" :

    alias ggg 'if((\!:1 =~ "bla*" || \!:1 == "tutu"))  eval "echo 'a'; echo 'x'"  ; if(\!:1 =~ "xxx*") eval "echo 'b' ; echo 'c'"'
    
注意:如果参数不够,将导致类似 Bad ! arg selector. 的错误。

我尝试使用eval和sed命令向txt文件添加标题,但我一直收到未识别的sed命令错误。在终端中运行sed命令可以正常工作。 - NikoTumi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接