BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Bashプログラムにヘルプ機能を追加する方法

このシリーズの最初の記事では、非常に小さな1行のBashスクリプトを作成し、シェルスクリプトを作成する理由と、コンパイルされたプログラムではなく、シェルスクリプトがシステム管理者にとって最も効率的なオプションである理由を探りました。 2番目の記事では、他のBashプログラムの開始点として使用できる非常に単純なテンプレートを作成するタスクを開始し、それをテストする方法を検討しました。

このシリーズの4つの記事のこの3番目では、簡単なヘルプ関数を作成して使用する方法について説明します。ヘルプ機能を作成する際には、関数の使用方法と、 -hなどのコマンドラインオプションの処理方法についても学習します。 。

なぜヘルプ?

かなり単純なBashプログラムでさえ、それがかなり初歩的なものであっても、ある種のヘルプ機能を備えている必要があります。私が作成するBashシェルプログラムの多くは使用頻度が低いため、必要なコマンドの正確な構文を忘れてしまいます。他のものは非常に複雑なので、頻繁に使用する場合でもオプションと引数を確認する必要があります。

ヘルプ機能が組み込まれているため、コード自体を検査しなくても、これらを表示できます。優れた完全なヘルプ機能もプログラムドキュメントの一部です。

関数について

シェル関数は、シェルの環境に格納されているBashプログラムステートメントのリストであり、他のコマンドと同様に、コマンドラインで名前を入力することで実行できます。シェル関数は、使用している他のプログラミング言語に応じて、プロシージャまたはサブルーチンとも呼ばれます。

関数は、他のコマンドの場合と同じように、スクリプトで、またはコマンドラインインターフェイス(CLI)から名前を使用して呼び出されます。 CLIプログラムまたはスクリプトでは、関数内のコマンドは呼び出されたときに実行され、プログラムフローシーケンスは呼び出し元のエンティティに戻り、そのエンティティ内の次の一連のプログラムステートメントが実行されます。

関数の構文は次のとおりです。

FunctionName(){program statements}

CLIで簡単な関数を作成して、これを調べてください。 (関数は、それが作成されたシェルインスタンスのシェル環境に保存されます。) hwという関数を作成します。 、「helloworld」の略です。 CLIで次のコードを入力し、 Enterを押します。 。次に、 hwと入力します 他のシェルコマンドと同じように:

[student@testvm1 ~]$ hw(){ echo "Hi there kiddo"; }
[student@testvm1 ~]$ hw
Hi there kiddo
[student@testvm1 ~]$

OK、それで私は標準の「Helloworld」スターターに少しうんざりしています。次に、現在定義されているすべての関数を一覧表示します。たくさんあるので、新しい hwだけを表示しています 関数。コマンドラインまたはプログラム内から呼び出されると、関数はプログラムされたタスクを実行し、終了して、呼び出し元のエンティティ、コマンドライン、または呼び出し元のステートメントの後のスクリプト内の次のBashプログラムステートメントに制御を戻します。

[student@testvm1 ~]$ declare -f | less
<snip>
hw ()
{
    echo "Hi there kiddo"
}
<snip>

その関数はもう必要ないので削除してください。 未設定でそれを行うことができます コマンド:

[student@testvm1 ~]$ unset -f hw ; hw
bash: hw: command not found
[student@testvm1 ~]$
ヘルプ関数の作成

こんにちはを開きます エディターでプログラムし、以下のヘルプ機能をこんにちはに追加します 著作権ステートメントの後、エコー「Helloworld!」の前のプログラムコード 声明。このヘルプ機能は、プログラムの簡単な説明、構文図、および使用可能なオプションの簡単な説明を表示します。ヘルプ関数への呼び出しを追加して、関数とプログラムの主要部分を視覚的に区別するコメント行をテストします。

################################################################################
# Help                                                                         #
################################################################################
Help()
{
   # Display Help
   echo "Add description of the script functions here."
   echo
   echo "Syntax: scriptTemplate [-g|h|v|V]"
   echo "options:"
   echo "g     Print the GPL license notification."
   echo "h     Print this Help."
   echo "v     Verbose mode."
   echo "V     Print software version and exit."
   echo
}

################################################################################
################################################################################
# Main program                                                                 #
################################################################################
################################################################################

Help
echo "Hello world!"

このヘルプ関数で説明されているオプションは、私が作成するプログラムでは一般的ですが、コードにはまだ含まれていません。プログラムを実行してテストします:

[student@testvm1 ~]$ ./hello
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|v|V]
options:
g     Print the GPL license notification.
h     Print this Help.
v     Verbose mode.
V     Print software version and exit.

Hello world!
[student@testvm1 ~]$

ヘルプを必要なときにだけ表示するロジックを追加していないため、プログラムは常にヘルプを表示します。関数は正しく機能しているので、 -h の場合にのみヘルプを表示するロジックを追加するために、読み進めてください。 このオプションは、コマンドラインでプログラムを呼び出すときに使用されます。

処理オプション

-hなどのコマンドラインオプションを処理するBashスクリプトの機能 プログラムを指示し、それが行うことを変更するためのいくつかの強力な機能を提供します。 -hの場合 オプションで、プログラムがヘルプテキストをターミナルセッションに出力してから、プログラムの残りの部分を実行せずに終了するようにします。コマンドラインで入力されたオプションを処理する機能は、 whileを使用してBashスクリプトに追加できます。 コマンド( Bashでプログラミングする方法:ループを参照) while の詳細については、こちらをご覧ください ) getopsと組み合わせて およびケース コマンド。

getops commandは、コマンドラインで指定されたすべてのオプションを読み取り、それらのオプションのリストを作成します。以下のコードでは、 while コマンドは、変数 $ options を設定することにより、オプションのリストをループします。 それぞれのために。 ケース ステートメントは、各オプションを順番に評価し、対応するスタンザのステートメントを実行するために使用されます。 ながら ステートメントは、すべてが処理されるか、プログラムを終了する終了ステートメントに遭遇するまで、オプションのリストを評価し続けます。

echo "Hello world!"の直前のHelp関数呼び出しを必ず削除してください。 プログラムの本体が次のようになるようにステートメントを記述します。

################################################################################
################################################################################
# Main program                                                                 #
################################################################################
################################################################################
################################################################################
# Process the input options. Add options as needed.                            #
################################################################################
# Get the options
while getopts ":h" option; do
   case $option in
      h) # display Help
         Help
         exit;;
   esac
done

echo "Hello world!"

-hのcaseオプションのexitステートメントの最後にある二重セミコロンに注意してください。 。これは、このcaseステートメントに追加された各オプションが、各オプションの終わりを示すために必要です。

テスト

テストはもう少し複雑になりました。プログラムがどのように応答するかを確認するには、オプションを使用せずに、さまざまなオプションを使用してプログラムをテストする必要があります。まず、オプションなしでテストして、「Helloworld!」が出力されることを確認します。必要に応じて:

[student@testvm1 ~]$ ./hello
Hello world!

これでうまくいくので、ヘルプテキストを表示するロジックをテストします。

[student@testvm1 ~]$ ./hello -h
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|t|v|V]
options:
g     Print the GPL license notification.
h     Print this Help.
v     Verbose mode.
V     Print software version and exit.

これは期待どおりに機能するため、いくつかのテストを試して、予期しないオプションを入力したときに何が起こるかを確認してください。

[student@testvm1 ~]$ ./hello -x
Hello world!
[student@testvm1 ~]$ ./hello -q
Hello world!
[student@testvm1 ~]$ ./hello -lkjsahdf
Add description of the script functions here.

Syntax: scriptTemplate [-g|h|t|v|V]
options:
g     Print the GPL license notification.
h     Print this Help.
v     Verbose mode.
V     Print software version and exit.

[student@testvm1 ~]$

プログラムは、エラーを生成せずに、特定の応答なしでオプションを無視します。ただし、最後のエントリに注意してください( -lkjsahdf オプションの場合): hがあるため オプションのリストで、プログラムはそれを認識し、ヘルプテキストを出力します。このテストでは、プログラムに誤った入力を処理し、検出された場合にプログラムを終了する機能がないことが示されています。

別のcaseスタンザをcaseステートメントに追加して、明示的に一致しないオプションと一致させることができます。この一般的なケースは、特定の一致を提供していないものと一致します。ケースステートメントは次のようになり、キャッチオールマッチは \?になります。 最後のケースとして。追加の特定のケースは、この最後のケースの前に置く必要があります:

while getopts ":h" option; do
   case $option in
      h) # display Help
         Help
         exit;;
     \?) # incorrect option
         echo "Error: Invalid option"
         exit;;
   esac
done

以前と同じオプションを使用してプログラムを再度テストし、プログラムがどのように機能するかを確認します。

どこにいますか

この記事では、コマンドラインオプションとヘルプ手順を処理する機能を追加することで、かなりの量を達成しました。これで、Bashスクリプトは次のようになります。

#!/usr/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                                         #
#  LinuxGeek46@both.org                                                        #
#                                                                              #
#  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   #
#                                                                              #
################################################################################
################################################################################
################################################################################

################################################################################
# Help                                                                         #
################################################################################
Help()
{
   # Display Help
   echo "Add description of the script functions here."
   echo
   echo "Syntax: scriptTemplate [-g|h|t|v|V]"
   echo "options:"
   echo "g     Print the GPL license notification."
   echo "h     Print this Help."
   echo "v     Verbose mode."
   echo "V     Print software version and exit."
   echo
}

################################################################################
################################################################################
# Main program                                                                 #
################################################################################
################################################################################
################################################################################
# Process the input options. Add options as needed.                            #
################################################################################
# Get the options
while getopts ":h" option; do
   case $option in
      h) # display Help
         Help
         exit;;
     \?) # incorrect option
         echo "Error: Invalid option"
         exit;;
   esac
done

echo "Hello world!"

このバージョンのプログラムを徹底的にテストしてください。ランダム入力を使用して、何が起こるかを確認します。また、ダッシュを使用せずに有効なオプションと無効なオプションをテストしてみてください(- )前に。

次回

この記事では、ヘルプ機能と、コマンドラインオプションを処理して選択的に表示する機能を追加しました。プログラムはもう少し複雑になっているため、テストはより重要になり、完了するにはより多くのテストパスが必要になります。

次の記事では、変数の初期化と、プログラムが正しい条件のセットで実行されることを確認するための健全性チェックの実行について説明します。

リソース
  • Bashでプログラミングする方法:構文とツール
  • Bashでプログラミングする方法:論理演算子とシェル拡張
  • Bashでプログラミングする方法:ループ

このシリーズの記事の一部は、David Bothの3部構成のLinux自習コース、Linuxの使用と管理-ZerotoSysAdminの第2巻第10章に基づいています。


  1. Mac にスタートアップ項目を追加する方法

    私たちは皆、Mac に大量のドキュメントやアプリケーションを詰め込んでいます。それらのいくつかは非常に便利で、定期的にアクセスする必要があります。このようなアプリケーションの例としては、Safari、Apple Mail などがあります。 では、Mac にログオンしたら、これらすべてのアプリケーションやドキュメントを自動的に開くのは素晴らしいアイデアではないでしょうか?この記事では、Mac の起動時にこれらの項目を追加する方法を学びます。 つまり、アイテムを Mac のスタートアップ アイテムとして追加すると、Mac にログインするたびにアイテムを手動で開く必要がなくなります。 スタートア

  2. PC 上の不要なプログラムをアンインストールする方法

    すっきりと整理された PC は、雑然とした PC よりも常に優れています。パフォーマンスを向上させ、パフォーマンスとセキュリティを維持するために、常に最適化する必要があります。不要なプログラムのクラスターにより、マシンの動作が遅くなり、ハードディスク スペースが詰まる。 したがって、清掃は必須ですが、簡単な作業ではありません。通常、不要なプログラムをアンインストールしようとすると、痕跡が残るか、さまざまな理由でアンインストールされません。 では、そのような状況であなたは何をしますか?一緒に、不要なプログラムを完全にアンインストールするさまざまな方法をチェックしてください。 ソフトウェ