複数の条件で for ループを実行しようとしていますが、Web 上でその実行方法に関する情報が見つかりませんでした
ばかげた質問で申し訳ありませんが、Linuxでプログラミングを始めたばかりです
ここで何が間違っていますか?
#!/bin/bash
j=0
for line in `cat .temp_` || j in `seq 0 19`
do
...
done
エラーは間違った構文を示しており、|| は使用できません。
どうもありがとう
for line in `cat .temp_`
do
if ! grep -Fxq $line $dictionary && [ $j -lt 20 ]
then
echo $line >> $dictionary
j=$((j+1))
fi
[ $j -gt 20 ] && break
done
for
シェルのループで条件を確認することはできません。追加のステートメントでそれを行う必要があります。この場合そう:
[ $j -gt 20 ] && break
別の解決策、なしbreak
:
while read line && [ $j -lt 20 ]
do
if ! grep -Fxq $line $dictionary && [ $j -lt 20 ]
then
echo $line >> $dictionary
j=$((j+1))
fi
done < .temp_
2 つの異なるスタイルのfor
ループを 1 つに結合しようとしています。j
代わりに、 の値が大きくなりすぎた場合に中断します。
j=0
while read -r line; do
[[ j >= 20 ]] && break
...
done < ._temp
(ちなみに、これは bash でファイルを反復処理するための推奨される方法です。for
-loop を使用すると、ファイルが大きすぎる場合に問題が発生します。基本的に、ファイルの内容全体を使用してコマンド ラインを構築するためです。)
[更新: 以下は、ループの目的に関する私の推測に基づいています。実際のコンテキストについては、bash のファイルから Word の出現箇所を計算するを参照してください。]
実際には、ループを省くことができます。名前が辞書にあるファイルにまだ表示されていない .temp_ から最大20行を探していますよね?
sort -u .temp_ | grep -f $dictionary -Fx -v -m 20 >> $dictionary
これはgrep
、 の行ごとに 1 回ではなく、1 回だけ呼び出され.temp_
ます。
単純なネストされた for ループ?
for line in `cat file`; do for j in {0..19}; do
your_commands
done; done
私があなたを正しく理解していれば(すべての行でコマンドを20回実行したい)。
ディレクトリ内のすべてのファイルを処理する必要がある場合は、n 番目のファイルまで、またはすべてが処理されるまで:
count=1
nth=10
for f in folder/*; do
((count++))
# process $f
if [[ $count -gt $nth ]]
then
break
fi
done