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