bashシェルスクリプトの構文エラー[複製]
-
10-07-2019 - |
質問
この質問にはすでに回答があります:
bashスクリプトで関数を作成しました。ただし、構文に不満があります。私は本当にそれが何なのか分かりません.....エラーメッセージは[:missing `] 'です
addem() {
if [ $# -eq 0] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
解決
最初の]
の前にスペースが必要です。つまり:
変更:
if [$#-eq 0] || [$#-gt 2]
to:
if [$#-eq 0] || [$#-gt 2]
他のヒント
試してください:
if [ $# -eq 0 ] || [ $# -gt 2 ]
(0と]の間にスペースはありませんでした。)
indyK1ng:"#" " $"はコメントとして扱われません。次の文字をエスケープします。 " $#"現在のコンテキストに存在する位置パラメータの数を表す内部変数です。これはシェルスクリプトへのコマンドライン引数の数と考えることができますが、その配列は" set-[args]"を使用してリセットできます。組み込み。
Joakim Elofsson:ifステートメントの全体的な構造は正しい、&quot ;;" 「その後」の前にのみ必要です。 「&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
Bashはスペースに敏感です。最初の行で、if [Y -eq X]を[Y -eq X]("]"の前のスペース)に置き換えます
以下に示すように、拡張テストコンストラクト(BASH)を使用します。文字の数が減り、読みやすさが向上すると思います(少なくともプログラマーにとっては)。 :-)
addem() {
if (( $# == 0 || $# > 2 ))
then
echo -1
elif (( $# == 1 ))
then
echo (( $1 + $1 ))
else
echo (( $1 + $2 ))
fi
}
括弧を避け、代わりに test
を使用する必要があります。
if test $# -eq 0 || test $# -gt 2
then
echo -1
elif test $# -eq 1
then
echo $(( $1 + $1 ))
else
echo $(( $1 + $2 ))
fi
シェルスタイルの改善を取得すると、はるかに改善されます。 :)