2017-09-07 34 views
2

我想做一个简单的tcsh脚本来查找一个文件夹,然后导航到它,如果它存在。该语句正确评估,但如果评估为false,则会出现“then:then/endif not found”错误。如果它评估为真,没有问题。我哪里错了?tcsh如果/然后语句给出错误

#!/bin/tcsh 
set icmanagedir = "" 
set workspace = `find -maxdepth 1 -name "*$user*" | sort -r | head -n1` 
if ($icmanagedir != "" && $workspace != "") then 
    setenv WORKSPACE_DIR `readlink -f $workspace` 
    echo "Navigating to workspace" $WORKSPACE_DIR 
    cd $WORKSPACE_DIR 
endif 

($ icmanagedir是elswehere初始化,但我得到的错误无论哪个变量是空的)

+0

提供[mcve]会很好,所以人们可以重现问题。因此,我猜想在'$ icmanagedir'和'$ workspace'周围加引号可以解决你的问题:'if(“$ icmanagedir”!=“”&&“$ workspace”!=“”)then'。也可以尝试在'('和''''之前)之后添加一个空格;一些tcsh版本对此非常挑剔(以及你通常不想在tcsh中编写程序的原因之一)。 – Carpetsmoker

+0

围绕变量和括号周围的空格添加引号并没有帮助。如果我将代码(更新)本身放在脚本中,我仍然会收到错误。 – Kayson

+0

嗯,你的例子对我来说运行得很好(因为'icmanagedir'总是''“''',所以'if'永远不会输入)。你错过了'setenv WORKSPACE_DIR ..'中的结尾反向符号。复制/粘贴错误? – Carpetsmoker

回答

1

的问题是,tcsh需求有一个换行符每一行结束,包括最后一行;它使用换行符作为“行终止字符”,并且如果它错过了它,则会出错。

您可以使用十六进制编辑器/浏览器来检查文件是否以新行结束:这里

$ hexdump -C x.tcsh             i:arch:21:49 
00000000 69 66 20 28 22 78 22 20 3d 20 22 78 22 29 20 74 |if ("x" = "x") t| 
00000010 68 65 6e 0a 09 65 63 68 6f 20 78 0a 65 6e 64 69 |hen..echo x.endi| 
00000020 66            |f| 

的最后一个字符,如果f(0x66),而不是一个换行符。正确的文件已0X0A作为最后一个字符(由.代表):

$ hexdump -C x.tcsh  
00000000 69 66 20 28 22 78 22 20 3d 20 22 78 22 29 20 74 |if ("x" = "x") t| 
00000010 68 65 6e 0a 09 65 63 68 6f 20 78 0a 65 6e 64 69 |hen..echo x.endi| 
00000020 66 0a            |f.| 

结束与一个新行文件的最后一行是一种常见的UNIX成语,和一些贝壳工具想到这个。有关这方面的更多信息,请参阅What's the point in adding a new line to the end of a file?

大多数UNIX编辑器(如Vim的,纳米,Emacs的,等等)应该在默认情况下做到这一点,但有些编辑器或集成开发环境在默认情况下做到这一点,但几乎所有的编辑器有一个设置,通过此可以启用。

最好的解决方案是在您的编辑器中启用此设置。如果你不能做到这一点,那么在最后添加一个空白行也可以解决你的问题。