2009-06-23 7 views
0

bashスクリプトで関数を書きました。しかし、それは文法について不平を言っています。私は本当にそれが何であるかを見ることができない.....エラーメッセージは次のとおりです。bashシェルスクリプトの構文エラー

addem() { 
      if [ $# -eq 0] || [ $# -gt 2 ] 
      then 
        echo -1 
      elif [ $# -eq 1 ] 
      then 
        echo $[ $1 + $1 ] 
      else 
        echo $[ $1 + $2 ] 
      fi 
    } 

答えて

12

]の前にスペースが必要です。それは次のとおりです。
変更:
if [ $# -eq 0] || [ $# -gt 2 ]
に:
if [ $# -eq 0 ] || [ $# -gt 2 ]

+4

これは歴史的に '['はシェル組み込みではなく、引数としてexpressonを受け取り、結果を返す別の実行可能ファイルであるためです。'['をスペースで囲まなければ、シェルは別のファイル名のために$ PATHを探しています(見つけられません)。 –

3

「[ `行方不明]試してみてください(0と]の間にスペースが

if [ $# -eq 0 ] || [ $# -gt 2 ] 

ありませんでした。 )

1

Bashはスペースに敏感です。最初の行で[Y -eq X]を[Y -eq X]( "]の前のスペース)に置き換えます。

0

あなたは括弧を避け、代わりにtestを使用する必要があります。

if test $# -eq 0 || test $# -gt 2 
then 
    echo -1 
elif test $# -eq 1 
then 
    echo $(($1 + $1)) 
else 
    echo $(($1 + $2)) 
fi 

better shell styleは、あなたがより良いようになります取得します。 :)

+0

いいえ、テストまたは単一のかっこの代わりに二重の角かっこを使用する必要があります。 –

2

indyK1ng: "#"は次の文字をエスケープするので、 "#"はコメントとして扱われません。 "$#"は、現在のコンテキストに存在する位置パラメータの数を表す内部変数です。これはシェルスクリプトのコマンドライン引数の数と考えることができますが、その配列は組み込みの "set - [args]"を使ってリセットできます。

Joakim Elofsson:ifステートメントの全体構造正しいです、 ";"別の行にリストされていない場合は、「then」の前と「fi」の前にのみ必要です。

問題は "0"とブラケットの間のスペースです。 Bashでは、条件式を区切るために使用する括弧は、式から少なくとも1つのスペースで設定する必要があります。

 if [ $# -eq 0] || [ $# -gt 2 ] # Wrong 

     if [ $# -eq 0 ] || [ $# -gt 2 ] # Correct 

さらに、2つの条件式を組み合わせることができます。オペレーター協会はすべてが確実に機能するようにします。

 if [ $# -eq 0 -a $# -gt 2 ] # Even Better 

私は表現評価のために二重括弧で提供される拡張機能を好む傾向があります。 2つの評価の組み合わせは、異なる演算子で行われることに注意してください。私はこれがより読みやすくなると思う。

 if [[ $# -eq 0 || $# -gt 2 ]] # My preference 

スクリプトの後半では、整数の追加に単一角かっこを使用することはお勧めしません。単一の括弧は、式をブール値に評価しています。整数演算には二重括弧が使用されます。

   echo $[ $1 + $1 ] # Evaluation of an expression 

       echo $(($1 + $1)) # Integer math 
1

以下に示すように、拡張テスト構造(BASH)を使用します。私はそれが文字の数を減らし、読みやすさを向上させると思う(少なくともプログラマーにとっては)。 :-)

addem() { 
     if (($# == 0 || $# > 2)) 
     then 
       echo -1 
     elif (($# == 1)) 
     then 
       echo (($1 + $1)) 
     else 
       echo (($1 + $2)) 
     fi 
} 
+0

バックテックはなぜですか? – ghostdog74

+0

ありがとうございました。私はそれがどうなったのだろうかと思っています。 – Jayan

関連する問題