2012-06-07 248 views
1

我目前正在將Linux上的csh腳本轉換爲Mac OS X lion上的bash腳本。將csh腳本轉換爲bash腳本

這個csh腳本的樣子:

setenv CNS_SOLVE '/Users/ucbthsa/Documents/haddock2.1/software/bin/' 
setenv CNS_SOLVE $CNS_SOLVE 
if (-d $CNS_SOLVE) then 
    if (! $?CNS_ARCH) setenv CNS_ARCH `$CNS_SOLVE/bin/getarch` 
else 
    setenv CNS_ARCH 'unknown' 
endif 

我轉換到Mac bash腳本如下所示:

export CNS_SOLVE='/Users/ucbthsa/Documents/haddock2.1/software/bin/cns_solve_1.3' 
export CNS_SOLVE=$CNS_SOLVE 

if [ -d $CNS_SOLVE ]; then 
    if [ ! $?CNS_ARCH ]; then 
    export CNS_ARCH='$CNS_SOLVE/bin/getarch' 
else 
    export CNS_ARCH='unknown' 
endif 

當我嘗試和源Mac的bash腳本,我得到以下錯誤:

-bash: cns_solve_env: line 10: syntax error: unexpected end of file

我不明白爲什麼我得到這個錯誤。

+1

「fi」而不是「endif」? – SignalToNoise

+1

兩個ifs,一個endif。 – bmargulies

+0

哦,還有第二個如果沒有關閉 – SignalToNoise

回答

3

你應該使用fi而不是endif並且如果你不關閉第一:

export CNS_SOLVE='/Users/ucbthsa/Documents/haddock2.1/software/bin/cns_solve_1.3' 
export CNS_SOLVE=$CNS_SOLVE 

if [ -d $CNS_SOLVE ]; then 
    if [ -z $CNS_ARCH ]; then 
    export CNS_ARCH="$CNS_SOLVE/bin/getarch" 
    fi 
else 
    export CNS_ARCH='unknown' 
fi 

*編輯:改變了第二次測試,威廉Pursell指出,這將無法正常工作它在bash中。

+1

'! $?CNS_ARCH'將始終評估爲false,因爲被測試的字符串總是「XCNS_ARCH」,其中'X'是'$?'的值。 –

+2

當您展開變量時,您應該雙引號:'[-d「$ CNS_SOLVE」]'特別是'[-z「$ CNS_ARCH」]'以避免解析混淆。另外,單引號會阻止變量擴展,所以使用'export CNS_ARCH =「$ CNS_SOLVE/bin/getarch」' –

0

$?CNS_ARCH意味着什麼sh不同。用途:

test -z "$CNS_ARCH" && CNS_ARCH=$($CNS_SOLVE/bin/getarch) 

CNS_ARCH=${CNS_ARCH-$($CNS_SOLVE/bin/getarch)} 

注意,這些都略有不同的含義。第一個是如果CNS_ARCH已經設置但是是空字符串,則將賦值給CNS_ARCH,而第二個將不會更改CNS_ARCH(如果它已經設置),但是爲空,這是$?在csh中所做的,但可能不是您其實想要。