我尝试使用简单的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,但无论哪个变量为空,我都会收到错误)
答案 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 不执行此操作,但几乎所有编辑器都这样做有一个设置,通过它可以启用它。
最佳解决方案是在编辑器中启用此设置。如果你不能这样做,那么在最后添加一个空行也可以解决你的问题。