構文エラー:計算を使用するときに予期しない「(」(「fi」が必要です)

構文エラー:計算を使用するときに予期しない「(」(「fi」が必要です)

私は最初にシェルに触れ、構文エラーが発生しましたが、まだ混乱しています。

#!/bin/dash

ls="ls -l test"
small=0
medium=0
large=0

for i in $(seq 11 9 56)
do
    filename=$(echo $($ls) | cut -d ' ' -f $i)
    count=$(wc -w test/$filename | cut -d ' ' -f 1)
    if [ "$count" -lt 10 ]; then
        small=(( $small+1 ))
    elif [ "$count" -gt 100 ]; then
        large=(( $large+1 ))
    else
        medium=(( $medium+1 ))
    fi
done
echo $small
echo $medium
echo $large

このコードでは、ファイルのリストを取得し、ファイルに含まれる単語の数を検索し、それを小/中/大サイズファイルに分類します。増加する変数を使用すると構文エラーが発生しないと確信していますtestが、if文では機能しないようです。誰でもこの問題を解決するのに役立ちますか? if文で複数の角かっこを使用すると構文エラーが発生しますが、そのエラーが何であるかわかりません。

答え1

構文は次のとおりです。

large=$(( $large + 1 ))

または、より良い方法は次のとおりです。

large=$(( large + 1 ))

いいえlarge=(( $large+1 ))

Kornのようなシェルには(( large = large + 1 ))また(( large += 1 ))はありますが、(( large++ ))POSIXでさえkshが次のように指定されます。$((...)) 算術拡張演算子sh, それらは省略します((...)) 算術表現演算子なので、dash実装には気にしませんでした。

とにかく、スクリプトの残りの部分はあまり意味がありません。意味するものは次のとおりです。

#! /bin/sh -

small=0 medium=0 large=0
for file in test/*; do
  words=$(wc -w < "$file") || continue
  if [ "$words" -lt 10 ]; then    # 0 to 9
    small=$(( small + 1 ))
  elif [ "$words" -gt 100 ]; then # 101 and above
    large=$(( large + 1 ))
  else                            # 10 to 100
    medium=$(( medium + 1))
  fi
done

printf '%s\n' "$small" "$medium" "$large"

次のこともできます。

...
  if [ "$words" -lt 10 ]; then    # 0 to 9
    kind=small
  elif [ "$words" -gt 100 ]; then # 101 and above
    kind=large
  else                            # 10 to 100
    kind=medium
  fi
  : "$(( $kind += 1 ))"
...

ここで、算術拡張は名前が格納されている変数の値を増加させる副作用が$kindあり、その拡張の結果をコマンドにnullを渡して削除するので、:実際にはkshスタイルに似ています(( $kind += 1 ))

答え2

代わりにあなたvar=$(( expr ))に必要です。var=(( expr ))

(単語を区切るために使用される制御演算子ですdash。だからvar=(...そうなっても役に立ちません。var= (...

(((例えば)知られているがbash知られていないdashので、これがうまくいかないのは驚くべきことではありません。

bash変数の割り当ては、単純なコマンド内でのみ許可され、bashなどの複合コマンドの前には許可されていないため、どちらの場合も機能しません。(( ))

関連情報