必要に応じて、プロンプトでシェルスクリプトを実行し、状況に応じて異なる動作をさせることができます。コマンドを実行するたびにプロンプトに音楽を鳴らすこともできますが、すぐに飽きてしまうかもしれません。詳しくは、Bash-Prompt HOWTOをご覧ください。
7.2.5. シェルスクリプト
7.2.5.1.スクリプトとは何ですか?
シェルスクリプトは、シェル設定の例で見たように、シェルコマンドを含むテキストファイルです。このファイルをBashの起動時に最初の非オプション引数として使い、 -c また -s オプションが指定されると、Bashはファイルからコマンドを読み込んで実行し、終了します。この動作モードでは、
非対話型シェル。Bashはシェルスクリプトを実行する際に特別なパラメータを設定する。 0 シェル名ではなくファイル名に設定され、位置パラメータ(スクリプト名に続くすべて)は、残りの引数が指定されている場合はその値に設定されます。追加の引数が指定されていない場合、位置パラメータは設定されません。
シェルスクリプトは、 chmod 実行ビットをオンにするコマンドです。Bashが検索中にそのようなファイルを見つけると、 パス コマンドの場合は、サブシェルを起動して実行します。つまり、
ファイル名 議論
実行するのと同じです
bash ファイル名引数
「filename」が実行可能なシェルスクリプトの場合、このサブシェルは自身を再初期化するため、新しいシェルが呼び出されてスクリプトを解釈したかのように動作します。ただし、親シェルが記憶しているコマンドの場所( ハッシュ 情報ページ内の情報は子供によって保持されます。
UNIXのほとんどのバージョンでは、これはオペレーティングシステムのコマンド実行機構の一部となっています。スクリプトの最初の行が2文字「#!」で始まる場合、行の残りの部分はプログラムのインタープリタを指定します。したがって、次のように指定できます。 bash, awk, パール または他のインタープリタやシェルを使用して、スクリプト ファイルの残りの部分をその言語で記述します。
インタプリタへの引数は、スクリプトファイルの1行目のインタプリタ名の後に続く1つの省略可能な引数、スクリプトファイル名、そして残りの引数で構成されます。Bashは、この処理を自身で処理しないオペレーティングシステム上でこのアクションを実行します。
Bashスクリプトは多くの場合、
#! /bin/bash (Bashがインストールされていることを前提としています / binに) は、別のシェルで実行される場合でも、スクリプトの解釈に Bash が使用されることを保証するためです。
7.2.5.2. 簡単な例
1 つのコマンドのみで構成される非常にシンプルなスクリプトで、これを実行するユーザーに挨拶します。
[ジェリー@どこにもいない〜] 猫 hello.sh
#!/ bin / bashに
echo "こんにちは $USER"
[ジェリー@どこにもいない〜] 猫 hello.sh
#!/ bin / bashに
echo "こんにちは $USER"
このスクリプトは実際には1つのコマンドのみで構成されています。 echoこれは の値 ($)の USER コマンドを発行するユーザーに合わせてカスタマイズされた文字列を印刷するための環境変数。
接続されたユーザーを表示するために使用されるもう 1 つのワンライナー:
#!/ bin / bashに
誰 | カット -d " " -f 1 | ソート -u
#!/ bin / bashに
誰 | カット -d " " -f 1 | ソート -u
以下に、ディレクトリ内のすべてのファイルのバックアップコピーを作成するために使用する、数行のスクリプトを示します。このスクリプトはまず、現在のディレクトリ内のすべてのファイルのリストを作成し、それを変数に格納します。 LIST次に、各ファイルのコピー名を設定し、ファイルをコピーします。各ファイルごとに、以下のメッセージが表示されます。
ティレ:~> cat bin/makebackupfiles.sh
#!/ bin / bashに
# ディレクトリ内のすべてのファイルのコピーを作成する LIST=`ls`
$LIST内のiに対して;
ORIG=$i
宛先=$i.old
cp $ORIG $DEST echo "$i をコピーしました"
行われ
ティレ:~> cat bin/makebackupfiles.sh
#!/ bin / bashに
# ディレクトリ内のすべてのファイルのコピーを作成する LIST=`ls`
$LIST内のiに対して;
ORIG=$i
宛先=$i.old
cp $ORIG $DEST echo "$i をコピーしました"
行われ
次のような行を入力するだけで mv * *。古い これはテストファイルで試してみるとわかるように、うまく動作しません。 echo 何らかのアクティビティを表示するためにコマンドが追加されました。 echoは一般に、スクリプトが動作しない場合に役立ちます。疑わしい各ステップの後に 1 つ挿入すると、すぐにエラーを見つけることができます。
AIマーケティング業界は、 /etc/rc.d/init.d ディレクトリにはたくさんのサンプルが含まれています。架空のICanSeeYouサーバーを制御するスクリプトを見てみましょう。
#!/ bin / shを
# 説明: ICanSeeYou を使用すると、ネットワーク上の人々を見ることができます
# プロセス名: ICanSeeYou
# pidファイル: /var/run/ICanSeeYou/ICanSeeYou.pid
# 設定: /etc/ICanSeeYou.cfg
# ソース関数ライブラリ。
. /etc/rc.d/init.d/functions
# どのように(どの引数で)呼び出されたかを確認します。case "$1" in
開始)
echo -n "ICanSeeYouを起動しています: " デーモンICanSeeYou
echo
/var/lock/subsys/ICanSeeYou をタッチする
;;
ストップ)
echo -n "ICanSeeYouをシャットダウンしています: "
#!/ bin / shを
# 説明: ICanSeeYou を使用すると、ネットワーク上の人々を見ることができます
# プロセス名: ICanSeeYou
# pidファイル: /var/run/ICanSeeYou/ICanSeeYou.pid
# 設定: /etc/ICanSeeYou.cfg
# ソース関数ライブラリ。
. /etc/rc.d/init.d/functions
# どのように(どの引数で)呼び出されたかを確認します。case "$1" in
開始)
echo -n "ICanSeeYouを起動しています: " デーモンICanSeeYou
echo
/var/lock/subsys/ICanSeeYou をタッチする
;;
ストップ)
echo -n "ICanSeeYouをシャットダウンしています: "
killproc ICanSeeYouエコー
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
状態)
ステータス ICanSeeYou
;;
再起動してください)
0ドル停止
0ドルからスタート
;;
*)
echo "使用方法: $0 {start|stop|restart|status}" exit 1
ESAC
0番出口
killproc ICanSeeYouエコー
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
状態)
ステータス ICanSeeYou
;;
再起動してください)
0ドル停止
0ドルからスタート
;;
*)
echo "使用方法: $0 {start|stop|restart|status}" exit 1
ESAC
0番出口
まず、 . コマンド(ドット)は、ほぼすべてのシェルスクリプトで使用されるシェル関数のセットです。
/etc/rc.d/init.dがロードされます。その後、 場合 コマンドが発行され、スクリプトの実行方法が4種類定義されます。例えば、 あなたが見えます startどちらのケースを適用するかは、スクリプトの最初の引数を読み込むことで決定されます。 $1.
準拠する入力が与えられなかった場合、アスタリスクでマークされたデフォルトのケースが適用され、スクリプトはエラーメッセージを表示します。 場合 リストは ESAC 声明。 start サーバープログラムはデーモンとして起動され、プロセスIDとロックが割り当てられます。 stop この場合、サーバープロセスは追跡されて停止され、ロックとPIDが削除されます。 デーモン オプション、および次のような機能 キルプロセスは、 /etc/rc.d/init.d/functions ファイルです。この設定は、この例で使用しているディストリビューションに固有のものです。お使いのシステムのinitscriptsでは、他のファイルで定義された他の関数が使用される場合や、全く関数を使用しない場合があります。
成功すると、スクリプトは親に終了コード 0 を返します。
このスクリプトは関数の使用例であり、これによりスクリプトが読みやすくなり、処理が高速化されます。関数が使用されていることに注意してください。 sh bashより幅広いシステムで使えるようにするために、Linuxシステムでは bash as sh シェルは POSIX 準拠モードで実行されます。