我目前正在将Linux上的csh脚本转换为Mac OS X Lion上的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:第10行:语法错误:意外的文件结尾
我无法理解为什么会收到此错误。
答案 0 :(得分: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
*编辑:改变了第二次测试,就像William Pursell指出的那样,它不会像在bash中一样工作。
答案 1 :(得分:0)
$?CNS_ARCH
意味着不同的东西。使用:
test -z "$CNS_ARCH" && CNS_ARCH=$($CNS_SOLVE/bin/getarch)
或
CNS_ARCH=${CNS_ARCH-$( $CNS_SOLVE/bin/getarch)}
请注意,这些含义略有不同。如果CNS_ARCH已经设置但是是空字符串,则第一个将分配给CNS_ARCH,而如果CNS_ARCH已经设置,则第二个将不会更改CNS_ARCH,但是为空,这是$?
在csh中的作用,但是可能不是你真正想要的。