Bashでテキスト処理にwhile読み取りループを使用するのが悪い場合はどうすればよいですか?

Bashでテキスト処理にwhile読み取りループを使用するのが悪い場合はどうすればよいですか?

あまりにも無邪気な質問かもしれませんが、わかりませんでしたが、私はそれを見たかったのですが...問題の解決策を見つけて発見しました。この非常に興味深い投稿[while|for]Bashでループを使用することが悪い習慣であると考えられる理由投稿には良い説明がありますが(選択した回答を参照)、問題の問題を解決するものが見つかりません。

私は広く検索しました。グーグル(またはduckduckgo-ed)でhow to read a file in bash得られたすべての結果は、上記の投稿によると確かにbashスタイルではないので、避けるべき解決策を指していました。特に以下の情報があります。

while read line; do
  echo $line | cut -c3
done

これ:

for line in `cat file`; do
  foo=`echo $line | awk '{print $2}'`
  echo whatever $foo
done

これはシェルスクリプトの非常に悪い例と見なされます。この時点で私は気になります。実際の質問は次のとおりです。 whileループは悪い習慣なので、投稿しないでください。どうすればいいですか?

編集:すでに屋根ふきの正確な問題に対処するコメント/質問があることがわかったwhileので、質問の範囲を少し拡張したいと思いました。基本的に、私はbashコマンドをより深く掘り下げる必要があり、それが私が実際にすべきことであることを理解しています。しかし、人々が検索してみると、一般的に人々は間違った方法でbashを使用して教えているようです(私のインターネット検索によると)。

ベストアンサー1

あなたがリンクした投稿のポイントはこれを説明することです通常、bashを使用してテキストファイルを解析することはお勧めできません。。これは特にループの使用に関するものではなく、他のコンテキストのシェルループには本質的に間違っていません。whileシェルスクリプトについて悪いことを言う人はいません。別の記事では、テキストファイルを解析するためにシェルを使用してはならず、他のツールを使用する必要があると述べました。

明らかに、「シェルの使用」とは、シェルの内部ツールを使用してファイルを開き、データを抽出して解析することを意味します。たとえば、次のようになります。

while read number; do
  if [ $number -gt 10 ]; then
    echo "The number '$number' is greater than 10"
  else
    echo "The number '$number' is less than or equal to 10"
done < numbers.txt

答えを読んでくださいシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?この種の行動がなぜ悪い考えなのかを学びましょう。ここでは、この記事が通常シェルループに反対するのではなく、シェルループ(またはシェル)を使用してファイルを解析することに反対していることを明らかにします。

bashを使用してこれを行うより良い方法の提案が見つからない理由は、bashや他のシェルを使用してこれを行うための良い方法がないためです。何をしても、シェルを使用してテキストを解析するのは遅くて面倒で、エラーが発生しやすいです。

シェルは、主にコンピュータで実行するコマンドを入力する方法として設計されています。スクリプト言語として使用できますが、実行コマンドを発行すると最適です。いいえ使用するとき代わりにテキスト解析を処理するように設計されたコマンドです。

シェルは他のツールと同様にツールなので、設計された目的に合わせて使用​​する必要があります。問題は、多くの人がシェルスクリプトを少し学んだので、「ハンマー」というツールを持っているということです。彼らが知っているのはハンマーだけなので、彼らが直面しているすべての問題は彼らには釘のように見え、彼らはその釘をハンマーにしようとします。残念なことに、テキスト解析はシェルが処理するように設計されていませんが、「釘」ではありません。

だから、「bashからファイルをどのように読むべきですか?」への答えはとても簡単です。 「bashを使用しないで、作業に適したツールを使用する必要があります。」

おすすめ記事