1

複数の条件で for ループを実行しようとしていますが、Web 上でその実行方法に関する情報が見つかりませんでした

ばかげた質問で申し訳ありませんが、Linuxでプログラミングを始めたばかりです

ここで何が間違っていますか?

    #!/bin/bash

j=0

for line in `cat .temp_` || j in `seq 0 19`
do
    ...

done

エラーは間違った構文を示しており、|| は使用できません。

どうもありがとう

4

4 に答える 4

7
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_
于 2012-08-07T16:25:32.000 に答える
5

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_ます。

于 2012-08-07T16:33:10.570 に答える
0

単純なネストされた for ループ?

for line in `cat file`; do for j in {0..19}; do
     your_commands
done; done

私があなたを正しく理解していれば(すべての行でコマンドを20回実行したい)。

于 2012-08-07T17:40:59.170 に答える
0

ディレクトリ内のすべてのファイルを処理する必要がある場合は、n 番目のファイルまで、またはすべてが処理されるまで:

count=1
nth=10
for f in folder/*; do
  ((count++))
  # process $f
  if [[ $count -gt $nth ]] 
  then
    break
  fi
done
于 2021-12-22T04:21:51.857 に答える