Bashスクリプトテンプレートの作成
このシリーズの最初の記事では、非常に小さな1行のBashスクリプトを作成し、シェルスクリプトを作成する理由と、コンパイルされたプログラムではなく、シェルスクリプトがシステム管理者にとって最も効率的なオプションである理由を探りました。
この2番目の記事では、他のBashスクリプトの開始点として使用できるBashスクリプトテンプレートの作成を開始します。テンプレートには、最終的に、ヘルプ機能、ライセンスステートメント、いくつかの単純な関数、およびこれらのオプションを処理するためのロジックと、このテンプレートに基づくスクリプトに必要となる可能性のあるその他のロジックが含まれます。
一般的な自動化と同様に、テンプレートの作成の背後にある考え方は、「怠惰なシステム管理者」になることです。テンプレートには、すべてのスクリプトに必要な基本コンポーネントが含まれています。これらのコンポーネントをすべての新しいスクリプトに追加する場合に比べて時間を節約でき、新しいスクリプトを簡単に開始できます。
いくつかのコマンドラインBashステートメントを1つのファイルにまとめて実行可能にするのは魅力的かもしれませんが、長期的には逆効果になる可能性があります。ヘルプ機能とコマンドラインオプションを受け入れる機能を備えた、適切に記述され、コメントが付けられたBashプログラムは、プログラムを保守するシステム管理者に適した出発点を提供します。これには、プログラムが含まれます。 書き込みと保守。
実行するすべてのプロジェクトに対して、常に一連の要件を作成する必要があります。これには、2つまたは3つの項目しかない単純なリストであっても、スクリプトが含まれます。私は多くのプロジェクトに携わってきましたが、通常は要件ステートメントがないか、記述が不十分なために、完全に失敗したか、顧客のニーズを満たすことができませんでした。
このBashテンプレートの要件は非常に単純です:
- 将来のBashプログラミングプロジェクトの開始点として使用できるテンプレートを作成します。
- テンプレートは、標準のBashプログラミング手法に従う必要があります。
- 以下を含める必要があります:
- プログラムの機能と変更ログを説明するために使用できる見出しセクション
- ライセンスステートメント
- 関数のセクション
- ヘルプ機能
- プログラムユーザーがrootかどうかをテストする関数
- コマンドラインオプションを評価する方法
基本的なBashスクリプトには3つのセクションがあります。 Bashにはセクションを描く方法はありませんが、セクション間の境界は暗黙的です。
- すべてのスクリプトはシバンで始まる必要があります(#! )、これはBashプログラムの最初の行である必要があります。
- 関数セクションは、シバンの後、プログラムの本体の前で開始する必要があります。すべてを文書化する必要性の一部として、各関数の前に、それが何をすることを意図しているかについての簡単な説明とともにコメントを付けます。さらに詳しく説明するために、関数内にコメントも含めます。短くて単純なプログラムは関数を必要としないかもしれません。
- プログラムの主要部分は、関数セクションの後にあります。これは、単一のBashステートメントまたは数千行のコードにすることができます。私のプログラムの1つには、コメントを除いて200行強のコードがあります。同じプログラムには600を超えるコメント行があります。
これですべてです。Bashプログラムの構造には3つのセクションしかありません。
いろいろな理由でいつもこれ以上追加しています。まず、シバンの直後にコメントのセクションをいくつか追加します。これらのコメントセクションはオプションですが、非常に役立ちます。
最初のコメントセクションは、プログラムの名前と説明、および変更履歴です。私はIBMで働いているときにこの形式を学びました。これは、プログラムの長期的な開発とそれに適用された修正を文書化する方法を提供します。これは、プログラムを文書化する上で重要なスタートです。
2番目のコメントセクションは、著作権とライセンスに関する声明です。私はGPLv2を使用していますが、これはGPLv2でライセンスされているプログラムの標準的なステートメントのようです。別のオープンソースライセンスを使用している場合は問題ありませんが、ライセンスに関する混乱を避けるために、コードに明示的なステートメントを追加することをお勧めします。スコットピーターソンの記事ソースコードはライセンスです この背後にある理由を説明するのに役立ちます。
したがって、スクリプトは次のようになります。
#!/bin/bash
################################################################################
# scriptTemplate #
# #
# Use this template as the beginning of a new program. Place a short #
# description of the script here. #
# #
# Change History #
# 11/11/2019 David Both Original code. This is a template for creating #
# new Bash shell scripts. #
# Add new history entries as needed. #
# #
# #
################################################################################
################################################################################
################################################################################
# #
# Copyright (C) 2007, 2019 David Both #
# [email protected] #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
################################################################################
################################################################################
################################################################################
echo "hello world!"
改訂されたプログラムを実行して、期待どおりに機能することを確認します。
今がテストについて話す良い機会です。
「常にもう1つのバグがあります。」
—ルバルスキーのサイバネティック昆虫学の法則
ルバルスキー—それが誰であろうと—は正しい。コード内のすべてのバグを見つけることはできません。私が見つけたすべてのバグについて、通常は非常に不適切な時期に発生する別のバグが常にあるようです。
テストはプログラムだけではありません。また、ハードウェア、ソフトウェア、またはユーザーが物事を壊すために見つけることができる無限の方法に起因するかどうかにかかわらず、実際に解決されるはずの問題が存在することを確認することでもあります。同様に重要なのは、テストとは、コードが使いやすく、インターフェースがユーザーにとって意味のあるものであることを確認することでもあります。
シェルスクリプトを記述およびテストするときに明確に定義されたプロセスに従うことで、一貫性のある高品質の結果を得ることができます。私のプロセスは簡単です:
- 簡単なテスト計画を作成します。
- 開発の最初からテストを開始します。
- コードが完成したら、最終テストを実行します。
- 本番環境に移行して、さらにテストします。
テスト計画にはさまざまな形式があります。私はすべてを頭の中に持っていることから、すべての範囲で作業してきました。一枚の紙に書き留められたいくつかのメモに。そして、各テストの完全な説明、テストする関数型コード、テストの実行内容、入力と結果の内容を必要とする複雑なフォームのセットに至るまで。
テスターであった(しかし現在はそうではない)システム管理者と言えば、私は中立的な立場をとろうとしています。少なくとも短い書面によるテスト計画を立てておけば、あるテスト実行から次のテスト実行までの一貫性が保証されます。必要な詳細は、開発およびテスト機能がどの程度正式であるかによって異なります。
Googleを使用して見つけたサンプルのテスト計画ドキュメントは複雑で、非常に正式な開発およびテストプロセスを持つ大規模な組織を対象としています。これらのテスト計画は、役職に「テスト」が含まれている人には適していますが、システム管理者のより混沌とした時間依存の作業条件にはうまく適用されません。仕事の他のほとんどの側面と同様に、システム管理者は創造的である必要があります。それで、ここにあなたのテスト計画に含めることを考慮すべき事柄の短いリストがあります。ニーズに合わせて変更します:
- テスト対象のソフトウェアの名前と簡単な説明
- テストするソフトウェア機能の説明
- 各テストの開始条件
- 各テストで従うべき機能
- 各テストの望ましい結果の説明
- 否定的な結果をテストするために設計された特定のテスト
- プログラムが予期しない入力を処理する方法をテストします
- 各テストの合格または不合格の構成要素の明確な説明
- ファジングテスト。これについては以下で説明します
このリストは、テスト計画を作成するためのいくつかのアイデアを提供するはずです。ほとんどのシステム管理者は、それをシンプルでかなり非公式に保つ必要があります。
実行可能な最初の部分を完了するとすぐに、常にシェルスクリプトのテストを開始します。これは、短いコマンドラインプログラムを作成している場合でも、実行可能ファイルであるスクリプトを作成している場合でも当てはまります。
私は通常、シェルスクリプトテンプレートを使用して新しいプログラムの作成を開始します。ヘルプ機能のコードを書いてテストします。これは通常、プロセスの些細な部分ですが、開始するのに役立ち、テンプレート内のものが最初から正しく機能していることを確認します。この時点で、スクリプトのテンプレート部分の問題を修正したり、標準テンプレートにはないニーズに合わせてスクリプトを変更したりするのは簡単です。
テンプレートとヘルプ機能が機能したら、プログラムの仕様を満たすために必要なプログラミング手順を文書化するコメントを追加して、プログラムの本体の作成に進みます。次に、各コメントに記載されている要件を満たすコードの追加を開始します。このコードでは、テンプレートのそのセクションで初期化された変数を追加する必要があります。これは現在、シェルスクリプトになっています。
これは、テストが単にデータを入力して結果を検証するだけではない場所です。少し余分な作業が必要です。時々、今書いたコードの中間結果を単に出力するコマンドを追加して、それを検証します。より複雑なスクリプトの場合は、 -tを追加します 「テストモード」のオプション。この場合、内部テストコードは、 -tの場合にのみ実行されます。 オプションはコマンドラインで入力します。
コードが完成したら、既知の入力を使用してすべての機能の完全なテストを実行し、特定の出力を生成します。また、いくつかのランダムな入力をテストして、プログラムが予期しない入力を処理できるかどうかを確認します。
最終テストは、プログラムが本質的に意図したとおりに機能していることを確認することを目的としています。最終テストの大部分は、開発サイクルの早い段階で機能していた機能が、サイクルの後半で追加または変更されたコードによって壊れていないことを確認することです。
スクリプトに新しいコードを追加するときにスクリプトをテストしている場合は、最終テスト中に驚くことはないはずだと思うかもしれません。違う!最終テストには常に驚きがあります。いつも。それらの驚きを期待し、それらを修正するために時間を費やす準備をしてください。最終テスト中にバグが発見されなかったとしたら、最終テストを行っても意味がありませんか?
えーと、なに?
「プログラムが少なくとも6か月間運用されるまで、最も有害なエラーが発見されることはありません。」
—トラウトマンのプログラミングの仮定
はい、本番環境でのテストは現在、正常で望ましいと見なされています。私自身テスターだったので、これは理にかなっているようです。 「でも待って!それは危険だ」とあなたは言う。私の経験では、専用のテスト環境での大規模で厳密なテストほど危険ではありません。場合によっては、テスト環境がなく、本番環境のみであるため、選択の余地がありません。
システム管理者は、本番環境で新しいスクリプトまたは改訂されたスクリプトをテストする必要があることを知らない人ではありません。スクリプトが本番環境に移行するたびに、それが究極のテストになります。実稼働環境は、そのテストの最も重要な部分を構成します。テスターがテスト環境で夢見ることができるものは、真の実稼働環境を完全に複製することはできません。
実稼働環境でのテストの新しい慣行は、システム管理者がずっと知っていたことを認識するだけです。最良のテストは、それが唯一のテストではない限り、本番環境です。
これは、最初に目を転がした原因となった流行語の1つです。その本質的な意味は単純です。何かが起こるまで誰かにキーを叩いてもらい、プログラムがそれをどれだけうまく処理するかを見てください。しかし、それだけではありません。
ファジングテストは、息子がランダムな入力で1分以内にゲームのコードを壊したときと少し似ています。これで、彼のためにゲームを書くという私の試みはほぼ終わりました。
ほとんどのテスト計画は、特定の結果または出力を生成する非常に特定の入力を利用します。テストが肯定的または否定的な結果を成功として定義するかどうかに関係なく、テストは引き続き制御され、特定の障害モードの特定のエラーメッセージなど、入力と結果が指定され、期待されます。
ファジングテストとは、開始条件、非常にランダムで予期しない入力、選択されたオプションのランダムな組み合わせ、低メモリ、他のプログラムと競合する高レベルのCPU、テスト中のプログラムの複数のインスタンスなど、テストのすべての側面でランダム性を処理することです。 、およびテストに適用すると考えられるその他のランダムな条件。
私は最初からファジングテストを行うようにしています。 Bashスクリプトが非常に初期の段階で重大なランダム性を処理できない場合は、コードを追加しても改善される可能性は低くなります。これは、コードが比較的単純なときに、これらの問題を見つけて修正する良い機会です。各段階での少しのファジングテストは、さらに多くのコードによってマスクされる前に問題を特定するのにも役立ちます。
コードが完成した後、私はいくつかのより広範なファジングテストを行うのが好きです。常にファジングテストを行ってください。私は確かにいくつかの結果に驚いています。期待されることをテストするのは簡単ですが、ユーザーは通常、スクリプトを使用して期待されることを行いません。
この記事は、テンプレートを作成する方法で少し達成しましたが、主にテストについて説明しました。これは、テストがあらゆる種類のプログラムを作成する上で重要な部分であるためです。このシリーズの次の記事では、基本的なヘルプ関数と、 -hなどのオプションを検出して操作するためのコードを追加します。 、Bashスクリプトテンプレートに。
- Bashでプログラミングする方法:構文とツール
- Bashでプログラミングする方法:論理演算子とシェル拡張
- Bashでプログラミングする方法:ループ
このシリーズの記事の一部は、David Bothの3部構成のLinux自習コース、Linuxの使用と管理-ZerotoSysAdminの第2巻第10章に基づいています。
-
星空を眺めるときは、この便利なBashスクリプトを使用してください
Linuxがサーバーや開発者によって使用されていることについてよく話しますが、天文学を含む他の多くの分野でも使用されています。 Linuxで利用できる天文学ツールはたくさんあります。たとえば、スカイマップ、星図、望遠鏡を制御するための望遠鏡ドライブシステムへのインターフェイスなどです。しかし、天文学者にとっての1つの課題は、暗闇の中で目を動かしながらコンピューターを使用することです。 夜に野外で運動するとき、天文学者は彼らの暗視を維持する必要があります。人間の目が完全に拡張して低照度レベルに調整されるまで最大30分かかる場合があります。また、電話やラップトップを通常の色と明るさのレベルで
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取