将csh脚本转换为bash脚本

时间:2012-06-07 14:31:13

标签: bash csh

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

我无法理解为什么会收到此错误。

2 个答案:

答案 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中的作用,但是可能不是你真正想要的。