シェルスクリプトについて聞いたことがあるものの、
・どのようなプログラムか分からない…。
・シェルスクリプトの使い方が知りたい…。
という方も多いのではないでしょうか。そこでこの記事では、
・シェルスクリプトの基本知識や用途
・シェルスクリプトのコードの書き方
について解説します。
シェルスクリプトに触れるのが初めての方でも、この記事を読めば、基本的な使い方や実行方法が身に付きます。
公開日:2024年5月16日
シェルとは操作の受付や動作の結果の出力を行うプログラム
「シェル」とは、ユーザーからの操作を受け付け、操作通りに動作した結果を出力するプログラムです。
一度でもLinux環境やUnix環境に触れた経験がある人なら、lsコマンドやcdコマンドを画面で実行し、コンピュータから出力される結果を見たことがあるかもしれません。その処理を実行するプログラムが「シェル」です。
シェルは、ユーザーによって画面に入力されたコマンドを解釈し、「カーネル」に引き渡します。
「カーネル」とは、CPUやメモリ、ハードディスクなどのハードウェアとソフトウェアを仲介するプログラムのことです。OSの中核部分を担っています。
このカーネルが出力した処理結果をシェルに渡し、ユーザーがわかるように解釈して画面に表示するのです。
シェルにも「Bourneシェル」「cシェル」「Friendly Interactiveシェル(fish)」など複数の種類がありますが、Linuxにおいて現在一般的なシェルは「Bourne Againシェル(bash)」です。
bashは、Bourneシェルをベースに後発シェルの優れた点を取り入れて高機能化を図ったシェルです。次のような機能が使用できます。
- コマンドライン編集
- ジョブ制御
- コマンド履歴参照
- ディレクトリスタック
- $RANDOM変数
- コマンド置換機
- コマンド名/ファイル名自動補完
シェルスクリプトは、このシェルで用いられるスクリプト言語のことです。
シェルの仕組みや種類、機能について詳しく知りたい方は、下記の記事を参考にしてください。
◆シェル(Shell)とは?仕組みや種類・シェルスクリプトの実行方法まで解説!◆Linuxのシェル(Shell)とは?機能や種類を網羅的に解説
\文字より動画で学びたいあなたへ/
Udemyで講座を探す >シェルスクリプトとは?
シェルスクリプトとは、シェルによって解釈・実行される一連の処理を記述したスクリプトです。狭義では、Unixシェルで用いられるスクリプト言語を指します。
ここでは、シェルスクリプトの概要やできることについて解説します。
シェルで実行するコマンドを書き連ねたプログラム
「スクリプト(script)」は「台本」という意味で、コンピュータに実行させたい処理を記述してコンピュータを動かせます。
この台本をテキストデータで用意したものがシェルスクリプトです。コマンド・インタプリタとも呼ばれています。
「インタプリタ」は「通訳者」という意味です。コンピュータにおいては、命令を1つずつ解釈して実行するプログラムのことを指します。
作業を自動化させたい時などに役立つ
シェルスクリプトは、単純なコマンドと標準入出力、繰り返し、条件分岐などを組み合わせて処理できる業務での利用に向いています。
具体的には、次のような業務です。
定期作業の自動化
定期的に実行する決まった作業は、シェルスクリプトで自動化できます。自動できる作業の例は、あるディレクトリの中身を毎朝8時に全て消去する、決まったプログラムを毎日夜9時に再起動する、などの処理です。
作業の記録
日報や作業時間の記録なども、シェルスクリプトで実行できます。「script」というLinuxコマンドを記述することで、シェルスクリプトによる作業の記録が可能です。過去の作業ログを参照できるため、トラブルが発生した際などに役立ちます。
複数コマンドをまとめて処理
複数のコマンドを列挙するだけでまとめて処理できる点も、シェルスクリプトの長所です。単純であるもののミスが発生しやすい作業などは、シェルスクリプトでまとめて実行することで効率化できます。
ターミナルは怖くない!コマンド & Zsh 入門コース【コマンド/Zsh/Homebrew/APT/正規表現付き!】
初心者でも大丈夫!macOS/Windowsだけで学習可能です。terminalの操作、コマンド、シェルスクリプト基礎、コマンドのインストール方法、Zsh活用方法まで、まとめて習得 ※WindowsはWSLでLinux(Ubuntu)を用意
\無料でプレビューをチェック!/
講座を見てみるシェルスクリプトを作成&実行してみよう
それでは、実際にシェルスクリプトを作成していきましょう。今回はUbuntu 19の環境で、「Hello World」と画面に出力するシェルスクリプトを作成します。
ファイル名は「hw.sh」とし、下記コマンドをホームディレクトリで実行してみましょう。
1 |
$ vi hw.sh |
すると、viエディタが立ち上がってきますので、「i」キーを押下し、以下の文章を1行目に入力しましょう。
1 |
echo “Hello World” |
入力が完了したら、「esc」キーを押下し、「:wq」と画面に入力して「Enter」キーを押下します。これで保存ができたはずです。
ここで「ls -la」コマンドを実行すると、「hw.sh」の実行権限は次の通りになっています。
1 |
-rw-r--r-- |
この場合、誰にも実行権限がない状態なので、実行権限を所有者に付加しましょう。
実行権限を所有者に付加するには、以下コマンドを実行しましょう。
1 |
$ chmod 744 hw.sh |
コマンド実行後、「ls -la」コマンドを実行すると、「hw.sh」の所有者に実行権限(x)がついているのを確認できます。
1 |
rwxr--r-- |
続いて、いよいよシェルを実行します。
今回は、次の3パターンで実行してみます。
いずれも同様に「Hello World」と画面に出力されます。
- bashコマンドで実行
1 |
$ bash /home/[ユーザー名]/hw.sh |
- コマンドとして直接実行
1 |
$ /home/[ユーザー名]/./hw.sh |
- PATHを通して実行
1 2 3 4 5 6 |
$ export PATH=$PATH: /home/[ユーザー名]/ $ cd /home $ bash hw.sh |
通常、プログラムを実行する際には、絶対パスを指定して実行する必要があります。
ここで、絶対パスではなく「PATHを通す」ことにより、そのPATH直下に存在するプログラムを、プログラム名だけで実行できるようになるのです。
しかし、OSを再起動すると、上記コマンドで設定したPATHの内容は消えてしまいます。永続的にPATHを設定したい場合は、対象ユーザーのホームディレクトリ直下にある「.bash_profile」と呼ばれるファイルに追記することが一般的です。
.bash_profileは、デフォルトで次のようなファイル内容になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH unset USERNAME |
この中で「PATH=$PATH:$HOME/bin」の後ろに新しいPATHを追記し、「PATH=$PATH:$HOME/bin:/home/[ユーザー名]/」としましょう。追記したら「esc」キーを押下し、「:wq」と入力して保存することも忘れずに。
すぐにPATHの設定内容を反映したい場合は、下記コマンドをホームディレクトリ直下で実行します。
1 |
$ source ~/.bash_profile |
シェルスクリプトでは、特に何も指定しなかった場合、実行結果の出力先はディスプレイとなっています。しかし、次のようなコマンドにより、ディスプレイへの標準出力を変更することも可能です。
1 |
command > output.txt |
このコマンドを追記すると、実行結果が「output.txt」というテキストファイルに書き込まれます。同様に、コード実行時にエラーが出た場合の標準エラー出力は、下記のコマンドで変更できます。
1 |
command 2> output.txt |
シェルスクリプトでは、エラーが出た場合であっても処理が中断されません。コマンドに誤りがあった場合に処理を中断させたい時は、次のような「set」コマンドのオプションを指定しましょう。
オプション | 機能 |
-e | エラーが出た時に実行を止める |
-u | 定義されていない変数を使おうとした時にエラーを出す |
-o pipefail | 全てのコマンドを確認し、エラーが1つでも見つかった場合に処理を中断する |
例えば、シェルスクリプトの冒頭に次のように記述しておくことで、エラーへの対処が可能です。
1 |
Set -eu -o pipefail |
シェルスクリプトで使用できる機能
シェルスクリプトには、データを格納するための「変数」や、繰り返し(for/while/until)、条件分岐(if/case)などの機能が備わっています。各機能の基本的な使い方は次の通りです。
変数
変数は、文字列や数値などのデータを記憶しておくための機能です。演算や値の入出力などを組み合わせることで、様々な処理に使用できます。
変数を画面に出力したい場合は、「echo [変数名]」と記載すれば出力可能です。
また、「特殊変数」と呼ばれる変数も存在し、最初から値が設定されています。
主な特殊変数は、以下の通りです。
特殊変数名 | 設定値 |
$! | バックグラウンドで実行されたコマンドのプロセスID |
$? | 直前に実行したコマンドの終了ステータス |
$$ | コマンドのプロセスID |
$# | シェルスクリプト実行時の引数の数 |
$* もしくは $@ | シェルスクリプト実行時の全引数 |
$0 | シェルスクリプトのファイル名 |
$1, $2, $3…… | N個目の引数の値 |
条件分岐
シェルスクリプトで利用できる条件分岐のためのコマンドは次の通りです。
コマンド | 機能 |
if | 指定した条件が真の場合に処理を行う |
case | 指定した条件が真の場合に処理を行う(複数の条件の内、最初に真だった処理以外はスキップ) |
例えば、ifを使ったシェルスクリプトの例は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash echo "数字を入力してください:" read number if [ $number -gt 5 ]; then echo "入力された数字は5より大きいです。" elif [ $number -eq 5 ]; then echo "入力された数字は5です。" else echo "入力された数字は5より小さいです。" fi |
このコードでは、入力された数字が5と比べて大きいのか、等しいのか、それ以外かという条件分岐を行っています。
caseを使ったシェルスクリプトの例は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash echo "自然数を入力してください:" read number case $number in [1-4]) echo "入力された数字は5より小さいです。" ;; 5) echo "入力された数字は5です。" ;; *) echo "入力された数字は5より大きいです。" ;; esac |
このコードでは、入力された自然数が1~4の場合、5の場合、それ以外の場合という条件分岐を行っています。
繰り返し
シェルスクリプトで、繰り返し処理を行うためのコマンドは次の通りです。
コマンド | 機能 |
for | 指定した数字の数だけ処理を繰り返す |
while | 指定した条件が真である限り処理を繰り返す |
until | 指定した条件が偽である限り処理を繰り返す |
例えば、forを使った繰り返し処理は次のように記述します。
1 2 3 4 5 6 7 8 |
#!/bin/bash # 1から3まで、数字を表示する処理を繰り返す for i in 1 2 3 do echo "$i" done |
whileを使ったシェルスクリプトの例は次の通りです。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # countが5未満である間、countの数を表示し1を加える処理を繰り返す count=0 while [ $count -lt 5 ] do echo "ループ: $count" count=$((count + 1)) done |
上記の例では、「$count -lt 5(countが5未満)」という条件が真である限りループが実行され、5以上となったときに終了します。
同様の処理を、untilを使って記述する場合のコード例は次の通りです。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # countが5以上になるまで、countの数を表示し1を加える処理を繰り返す count=0 while [ $count -ge 5 ] do echo "ループ: $count" count=$((count + 1)) done |
untilは、指定した条件が偽の場合に処理を続けるコマンドのため、「$count -ge 5(countの値が5以上)」という条件を指定しました。countの値が増え、5以上となった時点でループが終了します。
これらのほか、シェルスクリプトでは次のような機能も利用することが可能です。
- 連続したデータを格納する「配列」
- 処理内容をまとめられる「シェル関数」
- ユーザーからの入力を受け取る「ユーザー入力」
- 複数の選択肢を提示して入力を受け付ける「ユーザー選択」
複数の機能を組み合わせることで、より複雑な処理を実行できます。
実際にシェルスクリプトに触れてみよう!
シェルスクリプトは、OSの操作などを記述し、自動的に実行できるプログラムです。ソフトウェアの追加などは不要なため、手軽に扱うことができます。今回紹介したコード例などを参考にシェルスクリプトを作成し、作業を効率化していきましょう!
シェルスクリプトについてさらに詳しく学びたい方には以下の講座がおすすめです。
下記講座のレビューを一部紹介
評価:★★★★★
私はターミナル苦手、恐怖を持っていました。
まだ、コースの途中ですが、私にも出来そうで、勉強を続ければ乗り越えられて、使いこなせるようになれるという展望と自信が湧いてきました。
評価:★★★★★
dotfileの運用をシェルスクリプトで記述するために試行錯誤していたところ、かなり丁寧に解説がされていたので、今後の参考書としてこちらの動画を視聴させていただきます。
ありがとうございます。
最新情報・キャンペーン情報発信中