LinuCレベル1 102試験の出題範囲「1.06.2 シェルスクリプト」の技術的内容を解説します。
重要度 6 概要 簡単なBashスクリプトを新規作成できる。作成したBashスクリプトをシステムの利用者に適用できる。処理結果により動作を分岐できるスクリプトを作成できる。Linux スキルの無いユーザに規定のコマンドを実行できる環境を提供できる。シェルスクリプトの引数を処理できる。 詳細 よく使用する一連のコマンド用にBashの関数を作成する。
・function
先頭行(#!)を利用して、適切なスクリプトインタプリタを選択する。
スクリプトの位置、所有権、実行権を管理する。
・chown, chmod
標準的なshの構文(ループ)を使用する。
・for, while
コマンドの成功または失敗を示す戻り値を使用する。または、つぎに渡すコマンドのために戻り値を指定して終了する。
・$?, exit
条件に応じて処理を変更する。
・if, case
引数に応じて処理を変更する。
・$#, $*, $@, $0, $1..$n, shift
使用するユーザに依存しないスクリプトを作成する。
・PATH
シェルスクリプトをデバッグする。
・bash -v, bash -x

シェルスクリプトとは
シェルに対して、プログラムのような形で一つのファイルにまとめておいてそれをシェルに実行させることができます。このときのプログラムのような形で一つにまとめたファイルのことを「シェルスクリプト」といいます。
シェルは前回取り上げた通り、「Linuxとユーザーをつなぐインターフェイスとなるソフトウェア」です。Linuxでは、シェルを通じてシステムを操作するという局面が多くなります。
ここで、定期的にシステムを監視するなど、「何度も類似の操作を繰り返して行いたい」というケースを考えます。このケースでは、シェルに対して何度も同じようなコマンドを入力することになります。これは手間がかかります。
そこでシェルには、事前に一連の操作(実行するコマンドなど)をプログラムのような形でファイルに記述しておき、そのファイルの内容を実行するという機能が備わっています。このファイルを「シェルスクリプト」と呼びます。

シェルスクリプトの実行
シェルスクリプトのファイル名はシェルスクリプトの実行には影響がありません。
シェルスクリプトを実行するには、bashコマンドでシェルスクリプトを実行します。
ただし、シェルスクリプト内の先頭行に「#!/bin/bash」を記載しておけばbashコマンドでシェルスクリプトを実行しなくても、シェルスクリプトを実行することができます。#!から始まる業は、シェルスクリプトを実行するコマンドを指定しておくことができる行です。
ファイル名は、シェルスクリプトの実行方法には影響を与えません。
自作のシェルスクリプトは、以下のようにシェルのコマンドを使って実行することができます。
実行例1) $ bash testscript
実行例2) $ bash ./testscirpt
実行例3) $ bash /home/user/testscirptただ、この状態では、スクリプトを実行する場合にbashコマンドを使う必要があります。またカレントディレクトリにファイルが存在しない場合は、パスを指定する必要もあります。
つまり、通常のコマンド実行に比べて不便です。通常のコマンドの実行方法、つまり例題の実行方法と同じようにスクリプトを実行するためには、以下の手順が必要になります。
a)スクリプトの先頭行に「#!/bin/bash」を記載する
「#!」から始まる行は、シバンやシェバン(she-bang)と呼ばれる行です。この行にはスクリプトを実行するコマンドを指定します。

シェルの関数の概要
シェルの関数は以下のLinuC公式サイトに掲載されている例題の解説のように定義することができます。
まず、シェルの関数の定義と実行方法についてです。
関数は以下のように定義します。——————————————————————————————
function 関数名() {
実行するコマンド
}
——————————————————————————————以下のようにfunctionや()を省略して定義することもできます。
なお、両方とも省略することはできません。——————————————————————————————
関数名() {
実行するコマンド
}function 関数名 {
実行するコマンド
}
——————————————————————————————定義した関数は、コマンドと同じように実行できます。

シェルスクリプトの引数
シェルスクリプト実行時の引数に関する詳細をLinuC公式サイトの例題の解説から引用します。
引数処理に使用する変数は以下の通りです。
$# : 実行時に指定された引数の数を表す変数 $@ : スクリプト実行時に指定された全引数が格納される変数(引数ひとつひとつが””で囲まれる形式) $* : スクリプト実行時に指定された全引数が格納される変数(引数のすべてが””で囲まれる形式) $0 : 実行時のスクリプト名が格納される変数 $[1-n] : スクリプト実行時に指定した引数の値がそれぞれ格納される変数

$#の実行例
echoコマンドは、オプションに指定されたテキストを出力するコマンドです。echoコマンドのおプ本に$#を指定すると、引数に指定しているものの数が出力できます。
例1)script1.sh
ーー
#!/bin/bash
echo $#
ーー$ script1.sh one two three 3$# を表示すると、引数の数が表示されます。
試しtest.shファイルを作成して実行してみました。
[root@RHEL96 ~]# bash test.sh one two
2
[root@RHEL96 ~]#
[root@RHEL96 ~]#
[root@RHEL96 ~]# bash test.sh one
1
[root@RHEL96 ~]#
$*の実行例
例2)script2.sh
ーー
#!/bin/bash
echo $*
ーー
$ script2.sh one two three
one two three
$* を表示すると、すべての引数が表示されます。
$@の実行例
$0の実行例
の実行例
例3)script3.sh
ーー
#!/bin/bash
echo $0
ーー$ script3.sh one two three script3.sh$0 を表示すると、実行したスクリプト名が表示されます。
