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