tcsh if/then 语句给出错误

tcsh if/then statement gives error

我正在尝试执行一个简单的 tcsh 脚本来查找文件夹,如果存在则导航至该文件夹。该语句评估正确,但如果评估为假,我会收到错误 "then: 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 在其他地方被初始化,但是无论哪个变量为空我都得到错误)

问题是tcsh 需要每一行以换行结束,包括最后一行;它使用换行符作为 "line termination character",如果缺少它就会出错。

您可以使用十六进制 editor/viewer 检查文件是否以换行符结尾:

$ 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|

这里是最后一个字符if 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 不会执行此操作默认情况下,但几乎所有编辑器都有一个设置可以启用它。

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