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 不会执行此操作默认情况下,但几乎所有编辑器都有一个设置可以启用它。
最好的解决方案是在您的编辑器中启用此设置。如果您不能这样做,那么在末尾添加一个空行也可以解决您的问题。
我正在尝试执行一个简单的 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 不会执行此操作默认情况下,但几乎所有编辑器都有一个设置可以启用它。
最好的解决方案是在您的编辑器中启用此设置。如果您不能这样做,那么在末尾添加一个空行也可以解决您的问题。