2017-09-07 33 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的,等等)應該在默認情況下做到這一點,但有些編輯器或集成開發環境在默認情況下做到這一點,但幾乎所有的編輯器有一個設置,通過此可以啓用。

最好的解決方案是在您的編輯器中啓用此設置。如果你不能做到這一點,那麼在最後添加一個空白行也可以解決你的問題。