1

我目前正在将 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 行:语法错误:文件意外结束

我不明白为什么会收到此错误。

4

2 回答 2

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 中那样工作。

于 2012-06-07T14:33:35.533 回答
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 中所做的,但可能不是你实际的想。

于 2012-06-07T14:35:46.247 回答