シェルスクリプトとは
シェルスクリプトとは、「シェル」が解釈することができる「スクリプト」のことです。
シェルとは、ユーザーが入力したコマンドを認識し、Linuxのコアであるカーネルにそのコマンドを受け渡すプログラム群です。Linuxでコマンドを実行する場合、何らかのシェルの上で行います。
一方、スクリプトとは、コンパイル(機械語への変換処理)を行わずに実行される形態のプログラムのことをいいます。Linuxでは複数のコマンドを使ってある処理を行う場合、それら複数のコマンドをファイルに記述しておき、それをシェルに読ませて実行することができます。この「複数のコマンドをファイルに記述」したものがシェルスクリプトです。シェルスクリプトファイルを作成することにより、コマンドを1つ1つ入力し実行していく手間が省けます。
シェルスクリプトのメリットそれだけではありません。処理のフローを制御することも可能になります。例えば、「ある条件の時に処理Aを実行するが、その条件以外の時には処理Bを実行する」といった条件分岐処理や、 「ある処理Cを10回繰り返す」といった反復処理を記述できるのです。
何だかとても便利そうな気がしてきますよね。それでは、早速シェルスクリプトを作っていきましょう。
シェルスクリプトを作ってみよう
まず、簡単なシェルスクリプトを作成してみましょう。内容は次のとおりで、3行だけの非常にシンプルなスクリプトです。rootユーザのホームディレクトリに、スクリプトを記述したファイルを作成します。シェルスクリプトであると分かるよう、ファイルの拡張子は「.sh」にします。
#!/bin/bash echo TEST echo TEST2
1行目は何度も出てくるので覚えておきましょう。これはbashというシェルを使ってスクリプトを解釈し実行するという宣言です。
実は、シェルにはいくつも種類があります。bashはその内の1つに過ぎません。現在多くのLinuxディストリビューションでbashが標準のシェルとなっていますが、bash以外のシェルも使用できます。ただし、シェルによって使えない記述もあるため、このようにスクリプトの先頭で、どのシェルでスクリプトを実行するかを指定しておくのです。
もし、bash以外のシェルにスクリプトを実行させる場合には、そのシェルのパスを指定します。また、bashのパスが「/bin/bash」でなければ、そのパスを指定します。
2~3行目では、echo
コマンドで「TEST」「TEST2」という文字列を出力しています。このシェルスクリプトを実行すると、次のように文字列が表示されるはずです。
TEST TEST2
では、sample1.shを実際に実行してみましょう。スクリプトファイルを実行するには、そのファイルのパスを指定します。今回は相対パス指定を使って、./sample1.sh
と入力します。
# ./sample1.sh -bash: ./sample1.sh: 許可がありません
文字列は表示されず、エラーになってしまいました。なぜでしょう?
ファイルに実行権限を付与する
エラーになった理由は、スクリプトファイルを実行する権限が、自分に付与されていなかったためです。Linuxのユーザーはファイルに対し、「読み取り」「書き出し」「実行」という3つの操作を行うことができますが、そのためにはそれを行う権限(パーミッション)がファイルに付与されている必要があります。
ファイルに付与されているパーミッションはls -l
コマンドで確認できます。
# ls -l sample1.sh -rw-r--r-- 1 root root 24 2月 17 19:41 sample1.sh
コマンドの実行結果の先頭にある-rw-r--r--
がこのファイルに付与されているパーミッションを表しています。ただし、最も左にある1文字はパーミッションではなくファイルの種類を表します。パーミッションを表す記号は、左から2文字目から一番右の文字までです。
パーミッションを表す記号はその位置(何文字目か)で、誰に対するパーミッションかが決まっています。
- 左から2~4文字目:このファイルを作成したユーザーのパーミッション
- 左から5~7文字目:このファイルを作成したユーザーの所属グループ(前回を参照)にいる他のパーミッション
- 左から8~10文字目:その他のユーザーのパーミッション
パーミッションは3文字で表されます。並びは常に左からr
→w
→x
という順です。
- r:そのファイルの読み取り権限を持つ
- w:そのファイルの書き出し権限を持つ
- x:そのファイルの実行権限を持つ
- -:その権限を持たない
sample1.shの場合、このファイルを作成した自分に付与されている権限は、2~4文字目がrw-
であることから、読み取りと書き出しだと分かります。つまり、自分で作成したファイルではありますが、実行権限は付与されていません。これがエラーの原因だったのです。
それでは、sample1.shを実行できるよう、パーミッションを変更しましょう。パーミッションの変更はchmod
コマンドで行います。
# chmod 755 sample1.sh # ls -l sample1.sh -rwxr-xr-x 1 root root 24 2月 17 19:41 sample1.sh
権限を表すr
、w
、x
には数値が割り当てられています。r
は1、w
は2、x
は4です。chmod 755
コマンドの755
はこの数値を使って、付与したい権限の数値を自分、グループのメンバー、他のユーザーそれぞれで足し込んだものです。
自分には7
を指定してrwx
という権限(読み取り、書き出し、実行)を付与しています。グループのメンバー、他のユーザーには5
を指定してr-x
という権限(読み取り、実行)を付与しています。実行権限を付与するときには、必ず読み取り権限も付与します。ファイルが読めなければ実行できないからです。
これでsample1.shを実行するための権限が付与できました。それでは、再度実行してみましょう。
# ./sample1.sh TEST TEST2
実行されました。「echo
コマンドを2回実行し、”TEST”と”TEST2”という文字列を出力する」という処理をシェルスクリプトにまとめることができました。これだけではあまりメリットが感じられないかもしれませんが、これも立派なシェルスクリプトです。では、次にもう少し複雑なスクリプトを作成していきましょう。