パイプで連結されたテキストをgrepとして扱うには?

パイプで連結されたテキストをgrepとして扱うには?

grepのようなスクリーン印刷を処理するスクリプトが欲しい。
次のように実行できます。 cat file.txt私のスクリプト

以下のスクリプトを試しましたが、何も印刷されませんでした。

#!/bin/bash
line=$@
echo $line 

答え1

@glemcoの答えと同じ考えですが、このバージョンは特殊文字(NULLバイトを除く)に対して安全でなければなりません。

#!/bin/bash
while IFS= read -r line
do
  printf '%s\n' "$line"
done
  • IFS=先行スペースと末尾のスペースが切り捨てられるのを防ぐためです。
  • -rバックスラッシュエスケープ処理を防ぐために使用されます。
  • "二重引用符は、"$line"グローバル拡張を防ぎ、スペースシーケンスが単一のスペースで置き換えられるのを防ぐためのものです。

答え2

コマンドライン引数()で読み込もうとしていますが$@、で読み込む必要がありますstdin。デフォルトでは、パイプは最初のコマンドをstdout2番目のコマンドに追加しますstdin。 Bashで目的の操作を実行する簡単な方法は、read例に示すように組み込みコマンドを1行ずつ使用することです。

#!/bin/bash
while read line
do
  echo $line
done

もちろん、エコなしで欲しいものは何でもできます。

関連情報