1

私は現在、LinuxのcshスクリプトをMac OSXlionの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

*編集:2番目のテストを変更しました。WilliamPursellが指摘したように、bashの場合とは異なります。

于 2012-06-07T14:33:35.533 に答える
0

$?CNS_ARCHshで何か違うことを意味します。使用する:

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

また

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

これらの意味は少し異なることに注意してください。1つ目はCNS_ARCHがすでに設定されているが空の文字列である場合にCNS_ARCHに割り当てられ、2つ目はCNS_ARCHがすでに設定されているが空である場合は変更されません。これは$?、cshで行われることですが、実際にはそうではない可能性があります。欲しいです。

于 2012-06-07T14:35:46.247 に答える