Shoeisha Technology Media

資格Zine(しかくジン)

記事種別から探す

シェルスクリプトの構文・書き方と実行方法~パーミッションの設定も

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 本連載では、LPICレベル1学習のポイントを、全10回で解説していきます。第5回となる本稿のテーマは「シェルスクリプト」です。システム管理・運用の現場ではシェルスクリプトが多用されています。高いスキルを持つことでLinuxエンジニアとしての仕事が速くなり、高い評価を得られるでしょう。プログラミング経験のない方も難しく考えず、コマンドが処理されていく順番をまず押さえましょう。また、シェススクリプトの実行に必要な設定である「パーミッション」についても、最低限の説明を行います。

シェルスクリプトとは

シェルスクリプトとは、「シェル」が解釈することができる「スクリプト」のことです。

シェルとは、ユーザーが入力したコマンドを認識し、Linuxのコアであるカーネルにそのコマンドを受け渡すプログラム群です。Linuxでコマンドを実行する場合、何らかのシェルの上で行います。

一方、スクリプトとは、コンパイル(機械語への変換処理)を行わずに実行される形態のプログラムのことをいいます。Linuxでは複数のコマンドを使ってある処理を行う場合、それら複数のコマンドをファイルに記述しておき、それをシェルに読ませて実行することができます。この「複数のコマンドをファイルに記述」したものがシェルスクリプトです。シェルスクリプトファイルを作成することにより、コマンドを1つ1つ入力し実行していく手間が省けます。

シェルスクリプトのメリットそれだけではありません。処理のフローを制御することも可能になります。例えば、「ある条件の時に処理Aを実行するが、その条件以外の時には処理Bを実行する」といった条件分岐処理や、 「ある処理Cを10回繰り返す」といった反復処理を記述できるのです。

何だかとても便利そうな気がしてきますよね。それでは、早速シェルスクリプトを作っていきましょう。

シェルスクリプトを作ってみよう

まず、簡単なシェルスクリプトを作成してみましょう。内容は次のとおりで、3行だけの非常にシンプルなスクリプトです。rootユーザのホームディレクトリに、スクリプトを記述したファイルを作成します。シェルスクリプトであると分かるよう、ファイルの拡張子は「.sh」にします。

/root/sample1.sh
#!/bin/bash
echo TEST
echo TEST2

1行目は何度も出てくるので覚えておきましょう。これはbashというシェルを使ってスクリプトを解釈し実行するという宣言です。

実は、シェルにはいくつも種類があります。bashはその内の1つに過ぎません。現在多くのLinuxディストリビューションでbashが標準のシェルとなっていますが、bash以外のシェルも使用できます。ただし、シェルによって使えない記述もあるため、このようにスクリプトの先頭で、どのシェルでスクリプトを実行するかを指定しておくのです。

もし、bash以外のシェルにスクリプトを実行させる場合には、そのシェルのパスを指定します。また、bashのパスが「/bin/bash」でなければ、そのパスを指定します。

2~3行目では、echoコマンドで「TEST」「TEST2」という文字列を出力しています。このシェルスクリプトを実行すると、次のように文字列が表示されるはずです。

/root/sample1.shの実行結果の予想
TEST
TEST2

では、sample1.shを実際に実行してみましょう。スクリプトファイルを実行するには、そのファイルのパスを指定します。今回は相対パス指定を使って、./sample1.shと入力します。

/root/sample1.shの実行結果
# ./sample1.sh
-bash: ./sample1.sh: 許可がありません

文字列は表示されず、エラーになってしまいました。なぜでしょう?

ファイルに実行権限を付与する

エラーになった理由は、スクリプトファイルを実行する権限が、自分に付与されていなかったためです。Linuxのユーザーはファイルに対し、「読み取り」「書き出し」「実行」という3つの操作を行うことができますが、そのためにはそれを行う権限(パーミッション)がファイルに付与されている必要があります。

ファイルに付与されているパーミッションはls -lコマンドで確認できます。

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文字で表されます。並びは常に左からrwxという順です。

  • r:そのファイルの読み取り権限を持つ
  • w:そのファイルの書き出し権限を持つ
  • x:そのファイルの実行権限を持つ
  • -:その権限を持たない

sample1.shの場合、このファイルを作成した自分に付与されている権限は、2~4文字目がrw-であることから、読み取りと書き出しだと分かります。つまり、自分で作成したファイルではありますが、実行権限は付与されていません。これがエラーの原因だったのです。

それでは、sample1.shを実行できるよう、パーミッションを変更しましょう。パーミッションの変更はchmodコマンドで行います。

chmodコマンドでパーミッションを変更
# chmod 755 sample1.sh
# ls -l sample1.sh
-rwxr-xr-x 1 root root 24  2月 17 19:41 sample1.sh

権限を表すrwxには数値が割り当てられています。rは1、wは2、xは4です。chmod 755コマンドの755はこの数値を使って、付与したい権限の数値を自分、グループのメンバー、他のユーザーそれぞれで足し込んだものです。

自分には7を指定してrwxという権限(読み取り、書き出し、実行)を付与しています。グループのメンバー、他のユーザーには5を指定してr-xという権限(読み取り、実行)を付与しています。実行権限を付与するときには、必ず読み取り権限も付与します。ファイルが読めなければ実行できないからです。

これでsample1.shを実行するための権限が付与できました。それでは、再度実行してみましょう。

権限を付与後のsample1.shの実行結果
# ./sample1.sh
TEST
TEST2

実行されました。「echoコマンドを2回実行し、”TEST”と”TEST2”という文字列を出力する」という処理をシェルスクリプトにまとめることができました。これだけではあまりメリットが感じられないかもしれませんが、これも立派なシェルスクリプトです。では、次にもう少し複雑なスクリプトを作成していきましょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Linuxを知らない人のためのLPICレベル1【101試験】入門
All contents copyright © 2015-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.0