私は最初にシェルに触れ、構文エラーが発生しましたが、まだ混乱しています。
#!/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
などの複合コマンドの前には許可されていないため、どちらの場合も機能しません。(( ))