tcsh if / then语句给出错误

时间:2017-09-07 20:31:03

标签: tcsh

我尝试使用简单的tcsh脚本来查找文件夹,然后导航到该文件夹​​(如果存在)。该语句正确评估,但如果它评估为false,则会出现错误"然后:then / endif not found"。如果它评估为真,没问题。我哪里错了?

#!/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,但无论哪个变量为空,我都会收到错误)

1 个答案:

答案 0 :(得分:2)

问题是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习惯用法,有些shell工具需要这样做。有关详细信息,请参阅What's the point in adding a new line to the end of a file?

默认情况下,大多数UNIX编辑器(例如Vim,Nano,Emacs等)应该这样做,但默认情况下,某些编辑器或IDE 执行此操作,但几乎所有编辑器都这样做有一个设置,通过它可以启用它。

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