Shellスクリプトの中のLinuxテキストファイル行の内容を読むのはとても簡単です。これは安全な方法でそれをする方法です。
ファイル、テキスト、および慣用句
各プログラミング言語は一連の慣用句を持っています。これらは、一連の一般的なタスクを実現するための標準的な、フリルな方法です。プログラマーが働いている言語の機能の1つを使用するためのエレメンタリーまたはデフォルトの方法です。彼らは精神的な青写真のプログラマーのツールキットの一部になります。
ファイルからデータを読み、ループの操作、および2つの変数の値を交換するようなアクションは、良い例です。プログラマーは、一般的なまたはバニラファッションで彼らの目的を達成するための少なくとも1つの方法を知るでしょう。おそらくそれは手元の要求に十分です。あるいは、彼らはそれをより効率的にするためにコードを装飾するでしょう。しかし、それらの指先でビルディングブロックの慣用句を持つことは素晴らしい出発点です。
ある言語で慣用句を知って理解することは、新しいプログラミング言語を拾うことをより簡単にします。ある言語で物事をどのように構築し、他の言語の中で最も近いものを探しているかを知ることは、あなたがすでに知っているプログラミング言語とあなたが学んでいるものとの間の類似性と違いを理解するための良い方法です。
ファイルからの線を読む:1ライナー
bashでは、Aを使うことができます
その間
ファイルからのテキストの各行を読み込み、それを行うためにコマンドラインをループします。テキストファイルは "data.txt"と呼ばれます。年の月のリストを保持しています。
1月 2月 行進 。 。 10月 11月 12月
私たちのシンプルなワンライナーは次のとおりです。
読み取り線です。エコー$ラインをしなさい。行った< data.txt
NS
その間
ループファイルから行を読み取り、リトルプログラムの実行フローはループの本文に渡されます。 NS
エコー
コマンドは、ターミナルウィンドウにテキストの行を書き込みます。読み取られる行がなくなると、読み取りの試行は失敗し、ループが完了しました。
1つのきちんとトリックが能力です ファイルをループにリダイレクトするには 。他のプログラミング言語では、ファイルを開いて読み込み、終了したらもう一度閉じる必要があります。 BASHでは、ファイルのリダイレクトを使用して、シェルにそのすべての低レベルのスタッフを処理させることができます。
もちろん、この1つのライナーはひどく役に立ちません。 Linuxはすでに提供しています
猫
コマンド、それは私たちのためにそれを意味します。 3文字のコマンドを置き換えるための長い巻き取り方法を作成しました。しかし、それはファイルから読み取りの原則を視覚的に示しています。
それは十分に正常に動作します。月の名前を含む別のテキストファイルがあるとします。このファイルでは、改行文字のエスケープシーケンスが各行に追加されました。 「data2.txt」と呼びます。
1月\ N. 2月\ N. 3月\ N. 。 。 10月\ N. 11月\ N. 12月\ N
私たちの新しいファイルで私たちの1つのライナーを使ってみましょう。
読み取り線です。エコー$ラインをしなさい。行った< data2.txt
バックスラッシュエスケープ文字 "
\
「廃棄されました。その結果、「N」が各行に追加されたことです。 Bashは、バックスラッシュをアンケートしている
エスケープシーケンス
。多くの場合、私たちはそれが読んでいるのを解釈するためにbashを解釈したくありません。その全体のバックスラッシュエスケープシーケンスでラインを読むことがより便利なことができます。
意味のある処理やテキスト行を解析したい場合は、スクリプトを使用する必要があります。
スクリプト付きのファイルから行を読み取る
これが私たちのスクリプトです。それは「script1.sh」と呼ばれています。
#!/ビン/バッシュ
カウンタ= 0
] || [[ -N ] ];
(( カウンター ++
エコー ]
呼び出された変数を設定します
カウンター
ゼロにすると、私たちは私たちを定義します
その間
ループ。
While行の最初のステートメントIS
ifs = ''
。
ifs.
内部フィールドセパレータを表します。 Bashが単語の境界を識別するために使用する値を保持します。デフォルトでは、リードコマンドは先頭と末尾の空白をオフにします。ファイルから行を正確に読みたい場合は、設定する必要があります。
ifs.
空の文字列になるために。
値を設定しているのと同じように、ループの外側にこれを一度設定できます。
カウンター
。しかし、より複雑なスクリプトで - 特にそれらの中に多くのユーザー定義関数を持つもの - それは可能です
ifs.
スクリプト内の他の場所で異なる値に設定できます。それを確実にする
ifs.
たびに空の文字列に設定されます
その間
Loop Iteratesは、その行動が何であるかを知っていることを保証します。
呼び出された変数にテキストの行を読むつもりです
LineFromFile.
。私たちはを使っています
-NS
バックスラッシュを無視するには、(通常の文字としてバックスラッシュを読みます)オプション。彼らはただ他のキャラクターと同じように扱われるでしょう、そして特別な治療法を受けません。
満足する2つの条件があります
その間
ループをループして、テキストをループの本文で処理できます。
-
-r linefromfileを読んでください:ファイルからテキストの行が正常に読み込まれると、読んだコマンドは成功信号を送りますその間、 そしてそのその間ループ実行フローをループの本文に渡します。それは読んだコマンドはAを見る必要があります 改行キャラクター それが成功した読み取りを考慮するためにテキスト行の終わりに。ファイルがAではない場合 POSIX 準拠したテキストファイル 最後の行は改行のキャラクターを含めないかもしれません 。あれば読んだコマンドは ファイルマーカーの終わり (EOF)行が改行で終了する前に、 いいえ 成功した読み取りとして扱います。それが発生した場合、テキストの最後の行はループの本文に渡されず、処理されません。 -
[-n "$ {linefromfile}"]:POSIX非互換ファイルを処理するために追加の作業をする必要があります。この比較では、ファイルから読み取られたテキストが確認されます。改行の文字で終了しない場合、この比較はまだ成功を返します。その間ループ。これにより、末尾のラインフラグメントがループの本文によって処理されます。
これら2つの節は、または論理演算子によって分離されています」
||.
「その場合、その場合
また
句は成功を収め、検索されたテキストは、改行文字があるかどうかにかかわらず、ループの本文によって処理されます。
私たちのループの体には、私たちはインクリメントしています
カウンター
1つの変数と使用
エコー
ターミナルウィンドウに出力を送信するには。各行の行番号とテキストが表示されます。
ファイルをループにリダイレクトするために、リダイレクトトリックを使用することができます。この場合、スクリプトに渡された最初のコマンドラインパラメータの名前を保持する変数を1ドルにリダイレクトしています。このトリックを使用すると、スクリプトが機能するデータファイルの名前を簡単に渡すことができます。
スクリプトをコピーしてエディタに貼り付けて、ファイル名 "script1.shで保存します。"使用
chmod.
指図
それを実行可能にするために
。
CHMOD + X SCRIPT1.SH
私たちのスクリプトがdata2.txtテキストファイルとその中に含まれているバックスラッシュのものを見てみましょう。
/ script1.sh data2.txt
行のすべての文字は逐語的に表示されます。バックスラッシュはエスケープ文字として解釈されません。彼らは通常の文字として印刷されています。
ラインを関数に渡す
まだテキストを画面にエコーしています。現実のプログラミングシナリオでは、テキストの行に興味深いものをもっと興味深いものにすることをお勧めします。ほとんどの場合、別の関数の線のさらなる処理を処理するのは良いプログラミング慣習です。
これが私達がそれをすることができる方法です。これは "script2.sh"です。
私たちは私たちを定義します
カウンター
以前と同じように変数、それから我々は呼び出された関数を定義します
process_line()
。関数の定義が現れなければなりません
前
この機能はスクリプト内で最初に呼び出されます。
私たちの関数は、その繰り返しごとに新たに読み取られたテキスト行に渡される予定です。
その間
ループ。以下を使用して、その機能内のその値にアクセスできます。
1ドル
変数。関数に渡された2つの変数がある場合は、それらの値にアクセスすることができます。
1ドル
と
2ドル
など、より多くの変数のために。
W.
ハイル
ループは主に同じです。ループの本体の内側に変化が1つしかありません。 NS
エコー
行は電話に置き換えられました
process_line()
関数。呼び出しているときに、関数の名前の "()"ブラケットを使用する必要はありません。
テキスト行を保持している変数の名前、
LineFromFile.
それが関数に渡されると引用符で囲まれている。これはそれらの中にスペースを持っている線のための人々にとって得られます。引用符がなければ、最初の単語はとして扱われます。
1ドル
機能によって、2番目の単語は
2ドル
、 等々。引用符を使用すると、テキストの全行が完全に処理されるようにします。
1ドル
。これはこのものです
いいえ
同じ
1ドル
それはスクリプトに渡された同じデータファイルを保持します。
なぜなら
カウンター
関数内ではなく、スクリプトの本体で宣言されていますが、内部で参照できます。
process_line()
関数。
上のスクリプトをエディタにコピーまたは入力し、ファイル名 "script2.sh"で保存します。実行可能なものにしてください
chmod.
:
CHMOD + X SCRIPT2.SH
これでそれを実行して新しいデータファイル "data3.txt"を渡すことができます。これには月のリストがあり、その上にさまざまな言葉がある1行です。
1月 2月 行進 。 。 10月 11月\ Nmore Text "行の終わりに" 12月
私たちのコマンドは次のとおりです。
./ script2.sh data3.txt
行はファイルから読み取られ、1つずつ渡されます
process_line()
関数。バックスペース、引用符、およびそれに複数の単語を含む奇数を含む、すべての行が正しく表示されます。
ビルディングブロックが便利です
慣用句にはその言語に固有のものを含まなければならないと言っているという考えの電車があります。それは私が購読するという信念ではありません。重要なのは、その言語をよく使うことが覚えやすいということです、そしてあなたのコードにいくつかの機能を実装するための信頼性が高く堅牢な方法を提供します。