Bashと関連する科学について少し。 パート1

Linuxを管理タスクに積極的に使用している場合は、コンソールを時々見ます(または、コンソールに住んでいます)。 グラフィカルなインターフェースでテキストインターフェースが活発に混雑しているにもかかわらず、チェックマークを押してボタンをクリックする方がより直感的です。 この記事は、コマンドシェルの最も一般的な実装であるBash(Bourne-again Shell)に既に精通している人を対象としています。 何年もの間、この端末はほとんどすべてのLinuxディストリビューションでデフォルトで使用されてきたため、初心者は他のシェルがあることに気づきさえしません。 BashにはUNIXの先祖の知恵が注ぎ込まれており、開発に強くお勧めします。 これで、コンソールは「sudo /etc/rc.d/network restart」という形式のコマンドだけでなく有用であることがわかります。



エイリアス



3階建てのチームは非常にクールに見えますが、毎回入力するのは面倒です。 そのため、Bashを使用すると、任意のコマンドセットに対して短い任意のエイリアスを作成できます。 たとえば、「ls -a」を実行するエイリアスコマンド「la」を作成できます。



alias la='ls -a'







新しい設定を再起動したときに失われないように、エイリアスを〜/ .bash_aliasesファイルに書き込みます



条件文



少なくともプログラミングの基本に精通している人は、 if then elseなどの条件ステートメントの概念に精通しています 。 Bashはプログラミング言語ではありませんが、このような演算子の使用を許可します。これは非常に便利で、単純なタスクでPerlやPythonなどの言語を使用することを避けます。 以下に例を示します。



if uname -a | grep "GNU/Linux" > /dev/null; then echo " Linux"; fi







次のように機能します。最初に、「uname -a」コマンドが実行され、システムに関する情報が受信されます。 受信した情報はgrepフィルターを通して選別され、Grepフィルターはその中のGNU / Linux文字列を探します。 出力は "dev / null"(Linuxブラックホール)に送られます。これは、画面への出力ではなく、文字列の存在に関心があるためです。 、 then 、およびfiの 場合それは条件付きBash演算子です。 「if」は条件をチェックし、「then」は条件に一致するアクションを説明し、「fi」は論理構造の終わりを意味します。 条件はどんな複雑なものでも構いません。



より便利な例を見て、Firefoxシステムのどこかで実行されているかどうかを確認しましょう。 これを行うには、ps auxコマンドを使用して、出力をgrepフィルターにリダイレクトします。 Grep自体はプログラムであるため、プロセスのリストに含まれています。 「firefox」は「grep firefox」に含まれているため、この行の検索を開始したばかりですが、Firefoxはおそらくプロセスに含まれていることがわかります。 問題を回避するには、grepを2回使用して自分自身をフィルタリングします:) -vスイッチを付けて実行し、条件を反転します。



if ps aux | grep firefox | grep -v grep > /dev/null; then echo "Firefox "; fi







このような大きなチームを常に入力するのは不便なので、そこから短いエイリアスを作成します。



alias isff='if ps aux | grep firefox | grep -v grep > /dev/null; then echo "Firefox "; fi'







検証のために、 isffコマンドを実行するだけです。



サイクル



Bashの真の力は条件付きステートメントではなく、ループにあります。 ループは、特定の操作を繰り返し繰り返すために使用されます。 例を考えてみましょう:



while (true); do sleep 1; date; done







コマンドは、Ctrl + Cを押すまで、画面に1秒ごとに日付と時刻を表示します。 しかし、それはちょっと馬鹿げています。もっと便利なことをしましょう。



たとえば、1つのコマンドで複数のtar.bz2アーカイブを解凍するにはどうすればよいですか? そのため、「ls」コマンドを使用して、ディレクトリ内のbz2-filesのリストを取得し、ループを使用して各ファイルを個別に処理します。 もちろん、自動モードで。



for i in `ls *.tar.bz2`; do tar xjf "$i"; done







逆アポストロフィの記号に注意してください(キーボードの数字1の左側にあります)。 これは、ループ内の適切な場所でコマンド「ls * .tar.bz2」の結果を置き換えるステートメントです。



過小評価されたgrep



通常、Grepは次のようなモロニックタスクを解決するために使用されます。



somecommand | grep "fuuu"







つまり、一連の情報を粗くフィルタリングするためです(放射の誘導放出による光増幅のように聞こえます)。 一般に、grepコマンドには膨大な数のパラメーターがありますが、ここに最も基本的なパラメーターがあり、覚えておく必要があります。



-c検索文字列の出現回数をカウントします。

-i大文字と小文字を区別しない検索。

-l一致したファイルの名前を表示します(これは小文字のLです)。

-nクエリに対応する行の番号を表示します。

-r再帰的なディレクトリ検索を実行します。

-v検索語(検索のターゲットを含まない行)を反転します。




パラメーターを組み合わせて、grepを自分自身に向けることができます。 たとえば、拡張子が.txtのファイルを除き、単語「paul」(または「PAUL」、「PaUl」など)を含むファイルの数を数える必要がある場合は、次のようにする必要があります。



grep -ilr paul * | grep -cv "\.txt$"







ここでは、最も重要なgrepプロパティを使用します。 -ilrオプションの組み合わせは、ファイルで「PAUL」、「PaUl」などの単語の検索が実行されることを意味します。検索は、現在のディレクトリから開始してファイルシステムを通じて再帰的に実行され、一致するファイルの名前を返します。 これはすべて、grepの別のインスタンスに送られ、 -cvパラメーターで実行されます。このパラメーターには、正規表現「\ .txt $」に一致しないファイルをカウントおよび検索するモードが含まれます。 ここのバックスラッシュはドットをエスケープしますが、それなしでは特殊文字を取得します。 ドル記号は、.txtがファイル名の最後にあることを意味します。 つまり、「fuuu.txt.boo」は式と一致しません。



明らかではない



findコマンドは、常識の法則に従いません。 つまり、「find <needle> <haystack>」の形式で使用できるとは思わないでください。 対照的に、findはフィルターのような働きをします。



find .







末尾のドットは、現在のディレクトリ内のすべてのファイルのリストが返されることを意味します。 ただし、ls -aコマンドは基本的に同じことを行います。 したがって、タスクが複雑になります。 名前に「arr」が含まれるディレクトリにファイルがあります。



find . -name "*arr*"







「-size」パラメーターを追加して、1メガバイトより大きいファイルのみを検索することもできます。



find . -name "*bar*" -size +1M







-userパラメーターは、指定されたユーザーに属するファイルを返します。 例:



find . -name "*bar*" -user veles







また、「-not」パラメーターを使用すると便利です。これは、推測したとおり、検索を逆にします。



# , myfile.txt , veles

find . -not -name "myfile.txt" -not -user veles








もう1つのクールなフィルターは「-newer」です。 指定されたファイルより新しいすべてのファイルを返します。 これはバックアップスクリプトにとって非常に便利です。バックアップを作成するときに、任意のファイルを指定するだけで、find -newerコマンドで使用できるタイムスタンプとして機能します。 これにより、このファイルの作成以降に変更されたすべてのファイルのリストを取得できます。



find . -newer /path/to/myfile







今のところ十分です。 もちろん、多くの詳細が欠落しており、自分で勉強するために残っています。 Manaはまだ誰もキャンセルしていません。この記事の目的は、強力で強力なUNIXの方法に注意を向けることです。



次回は、マルチタスク管理に精通します(Linuxコンソールがマルチタスクであることを忘れていませんか?)。また、日常業務を自動化するお気に入りの手段になり得るcronスケジューラと友達になります。



おそらく経験のあるPS Unixoidは、これをすべて長い間知っています。 しかし、この記事は、食欲に興味がある人のために書かれています。



All Articles