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

Bashスクリプトを改善する5つの方法

システム管理者は、さまざまなタスクを実行するために、短いスクリプトと非常に長いスクリプトを作成することがよくあります。

ソフトウェアベンダーが提供するインストールスクリプトを見たことがありますか?多くの場合、インストールが適切に機能し、お客様のシステムに損傷を与えないようにするために、多くの機能とロジックが追加されます。何年にもわたって、Bashスクリプトを強化するためのさまざまなテクニックのコレクションを蓄積してきましたが、他の人に役立つことを願って、それらのいくつかを共有したいと思います。これらの簡単な例を説明するために作成された小さなスクリプトのコレクションを次に示します。

はじめに

私が始めたとき、私のBashスクリプトは一連のコマンドにすぎず、通常はWebコンテンツのデプロイなどの標準的なシェル操作で時間を節約することを目的としていました。そのようなタスクの1つは、静的コンテンツをApacheWebサーバーのホームディレクトリに抽出することでした。私のスクリプトは次のようになりました:

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

これにより、時間と入力の時間を節約できましたが、長期的には、非常に面白くて便利なスクリプトではありませんでした。時間の経過とともに、Bashスクリプトを使用して、ソフトウェアパッケージの作成、ソフトウェアのインストール、ファイルサーバーのバックアップなど、より困難なタスクを実行する他の方法を学びました。

1。条件文

他の多くのプログラミング言語と同様に、条件付きは強力で一般的な機能です。条件付きとは、コンピュータープログラムでロジックを実行できるようにするものです。私の例のほとんどは、条件付きロジックに基づいています。

基本的な条件は「if」ステートメントを使用します。これにより、スクリプトの実行方法を操作するために使用できる条件をテストできます。たとえば、Javaがインストールされていることを示すJavabinディレクトリの存在を確認できます。見つかった場合は、実行可能パスを場所で更新して、Javaアプリケーションによる呼び出しを有効にすることができます。

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"

2。実行を制限する

スクリプトを特定のユーザーのみが実行するように制限したい場合があります。 Linuxには、ユーザーとグループに対する標準のアクセス許可と、このタイプの保護を有効にするためのSELinuxがありますが、スクリプト内にロジックを配置することを選択できます。おそらく、特定のWebアプリケーションの所有者だけがその起動スクリプトを実行できることを確認したいでしょう。コードを使用して、スクリプトをrootユーザーに制限することもできます。 Linuxには、このロジックでテストできる環境変数がいくつかあります。 1つは$USER 、ユーザー名を提供します。もう1つは$UID です 、ユーザーの識別番号(UID)と、スクリプトの場合は実行中のユーザーのUIDを提供します。

ユーザー

最初の例は、複数のアプリケーションサーバーインスタンスがあるマルチホスティング環境で、スクリプトをユーザーjboss1に制限する方法を示しています。条件付きの「if」ステートメントは、基本的に「実行中のユーザーはjboss1ではありませんか?」と尋ねます。条件が真であることが判明すると、最初のechoステートメントが呼び出され、続いて exit 1が呼び出されます。 スクリプトを終了します。

if [ "$USER" != 'jboss1' ]; then
     echo "Sorry, this script must be run as JBOSS1!"
     exit 1
fi
echo "continue script"

ルート

この次のサンプルスクリプトは、rootユーザーのみが実行できることを保証します。ルートのUIDは0なので、 -gtを使用できます ゼロより大きいすべてのUIDを禁止する条件付きifステートメントのオプション。

if [ "$UID" -gt 0 ]; then
     echo "Sorry, this script must be run as ROOT!"
     exit 1
fi
echo "continue script"

3。引数を使用する

他の実行可能プログラムと同様に、Bashスクリプトは引数を入力として受け取ることができます。以下はいくつかの例です。ただし、最初に、優れたプログラミングとは、必要なことを実行するアプリケーションを作成するだけではないことを理解する必要があります。 できないアプリケーションを作成する必要があります しないことを行う 欲しいです。引数がない場合に、スクリプトが破壊的なことをしないようにするのが好きです。したがって、これはyの最初のチェックです。条件は引数の数$#をチェックします 、値がゼロの場合、trueの場合はスクリプトを終了します。

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"

複数の引数

スクリプトに複数の引数を渡すことができます。スクリプトが各引数を参照するために使用する内部変数は、 $ 1のように単純にインクリメントされます。 、 $ 2 $ 3 、 等々。上記の例を次の行で拡張して、最初の3つの引数をエコーし​​ます。明らかに、総数に基づいて適切な引数を処理するには、追加のロジックが必要になります。この例は、デモンストレーションのために単純です。

echo $1 $2 $3

これらの引数変数について説明しているときに、「彼はゼロをスキップしましたか?」と疑問に思われたかもしれません。

ええ、そうです、私はそうしました、しかし私には大きな理由があります!確かに$0があります 変数であり、非常に便利です。その値は、単に実行されているスクリプトの名前です。

echo $0

実行中にスクリプトの名前を参照する重要な理由は、スクリプトの名前を独自の名前に含むログファイルを生成することです。最も単純な形式は、echoステートメントだけかもしれません。

echo test >> $0.log

ただし、ユースケースに役立つと思われる名前と情報を使用してログが確実に書き込まれるように、コードをもう少し追加することをお勧めします。

4。ユーザー入力

スクリプトで使用するもう1つの便利な機能は、実行中に入力を受け入れる機能です。最も簡単なのは、ユーザーに入力を提供することです。

echo "enter a word please:"
 read word
 echo $word

これにより、ユーザーに選択肢を提供することもできます。

read -p "Install Software ?? [Y/n]: " answ
 if [ "$answ" == 'n' ]; then
   exit 1
 fi
   echo "Installation starting..."

5。失敗したら終了

数年前、最新バージョンのJava Development Kit(JDK)をコンピューターにインストールするためのスクリプトを作成しました。スクリプトは、JDKアーカイブを特定のディレクトリに抽出し、シンボリックリンクを更新し、alternativesユーティリティを使用してシステムに新しいバージョンを認識させます。 JDKアーカイブの抽出に失敗した場合、続行するとシステム全体でJavaが破損する可能性があります。そのため、このような状況でスクリプトを中止したかったのです。アーカイブが正常に抽出されない限り、スクリプトで次のシステム変更を行わせたくありません。以下は、そのスクリプトからの抜粋です。

tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
     echo "Installation failed - exiting."
     exit 1
fi

$?の使用法を簡単に説明する方法 変数はこの短いワンライナーにあります:

ls T; ec=$?; echo $ec

まず、 touch Tを実行します このコマンドが続きます。 ecの値 0になります。次に、 Tを削除します 、 rm T 、コマンドを繰り返します。 ecの値 T 以降、lsがエラー状態を報告するため、2になります。 見つかりませんでした。

このエラー報告を利用して、上記のように、スクリプトの動作を制御するロジックを含めることができます。

テイクアウト

より高度な機能を実現するには、Python、C、Javaなどの言語を使用する必要があると思われるかもしれませんが、必ずしもそうとは限りません。 Bashスクリプト言語は非常に強力です。その有用性を最大化するために学ぶべきことがたくさんあります。これらのいくつかの例が、Bashを使用したコーディングの可能性に光を当てることを願っています。


  1. Bash-it –スクリプトとエイリアスを制御するためのBashフレームワーク

    Bash-it は、 Bash 3.2+用のコミュニティBashコマンドとスクリプトのバンドルです。 、オートコンプリート、テーマ、エイリアス、カスタム関数などが付属しています。日常業務用のシェルスクリプトとカスタムコマンドを開発、保守、使用するための便利なフレームワークを提供します。 日常的にBashシェルを使用していて、すべてのスクリプト、エイリアス、関数を追跡する簡単な方法を探している場合は、 Bash-it あなたのためです! 〜/ binの汚染をやめましょう ディレクトリと.bashrc ファイル、フォーク/クローンBash-それをハッキングし始めます。 LinuxにBash-

  2. Linuxで効果的なBashスクリプトを作成するための10の便利なヒント

    シェルスクリプトは、Linuxで学習/実行できるプログラミングの最も簡単な形式です。さらに言えば、タスクを自動化し、ほんの数例を挙げると、新しいシンプルなユーティリティ/ツールを開発するためのシステム管理に必要なスキルです。 この記事では、効果的で信頼性の高いbashスクリプトを作成するための10の便利で実用的なヒントを紹介します。これらには、次のものが含まれます。 1。スクリプトでは常にコメントを使用する これは、シェルスクリプトだけでなく、他のすべての種類のプログラミングにも適用される推奨される方法です。スクリプトにコメントを書くと、あなたや他の誰かがスクリプトを読んで、スクリプトのさ