Linuxの「Shell」とは?Shellの種類やできることなどをわかりやすく解説
Linuxサーバーの管理に興味がありますか?サーバーの操作にはシェルの操作やシェルスクリプトの作成は欠かせません。
Shellは貝殻ではありませんが、Linux系OSの中核(カーネル)から見るとShellの名前にふさわしい役割を持っています。
シェルとシェルスクリプトの違いや、いろいろなシェルの種類、シェルの基本コマンドの使い方、スクリプトの作成方法も分かりやすく解説します。
-
Contents
Linuxのシェル(Shell)とは?
Linuxで管理的な操作をおこなう際にはシェル(Shell)と呼ばれるプログラムがオペーレーターとOSとの間に介在します。シェルの基本を詳しく見ていきましょう。
-
シェルの定義
シェルは、オペーレーターが入力した文字やファイルに記載されたテキストを解釈して、OSに伝え、逆にOSからの応答も文字として提示するプログラムの総称です。LinuxをはじめとするサーバーOSではシェルなどテキストベースの方式がよく使われます。
WindowsやmacOSではグラフィカルユーザーインターフェース(GUI)を標準としておりマウスを使いアイコンなどをクリックしてOSやアプリケーションを操作しますが、シェルは文字を使ってやりとりをするのが特徴です。
Linux系のOSで起動時に最初に読み込まれるのがカーネルです。カーネルはメモリやCPU、キーボードなど基本的なハードウェアを制御するOSの中核部分です。カーネルが起動したあと、ユーザーからの操作を受け付ける窓口となるのがシェルです。
シェル(Shell)は、英語の辞書を引くと、動植物の外部を覆う堅い部分などの意味ですが、中核となるOSのカーネルを包み込む包装紙や皮にあたるのがシェルであり、OSの中核とユーザーとの仲介をするソフトウェアです。
例えば、ラーメン店の厨房をカーネルに見立てると、注文を聞きに来る従業員がシェルに相当します。従業員は厨房に客の注文内容を伝えます。厨房では注文に応じて鍋やコンロなどのハードウエアを使い麺やスープなどが調理され、できあがった料理を従業員が目の前まで運んできてくれます。
-
シェルスクリプトとの関係性
シェルとシェルスクリプトは混同しがちですが、シェルはテキスト情報を解釈してOSとの仲介をしてくれるソフトウェアであり、シェルスクリプトはシェルに入力する一連のテキストをファイルに記録したものです。つまり、シェルはソフトウェアで、シェルスクリプトはテキストファイルです。
Linuxはさまざまな用途で使用できますが、サーバー用途の場合、例えば定期的にファイルをバックアップしたり不要なファイルを削除するなどの作業があります。
もちろん毎回シェルにキーボードからコマンドを入力してもよいですが、複数のコマンドを1文字も間違えずに、しかも深夜に実施するとなるとシェルスクリプトの出番です。
キーボードから入力するのが5つのコマンドだとすれば、単純にテキストの1行目に1つめのコマンド、テキストの2行目に2つめのコマンド、のように5行のテキストをファイルに保存すればシンプルなシェルスクリプトのできあがりです。
例えば、バックアップの場合は以下の内容をファイル名「my-backup.sh」で作成しておきます。
backup_files=“/home /var/spool/mail /etc /root /boot /opt” destination=“/mnt/backup” day=$(date +%A) archive_file=“backup-$day.tgz” tar czf $destination/$archive_file $backup_files |
手動で実行する場合は、シェルに対して以下を入力すればスクリプトを実行できます。
sh my-backup.sh |
一度シェルスクリプトとしてファイルに保存しておけば、手動実行以外にも定刻に実行したり他のプログラムから呼び出したり、再利用が可能です。
また、他のプログラミング言語に見られるような変数や制御構造など、処理の自動化に役立つ機能もシェルスクリプトは備えています。
-
シェルの種類
シェルは、OSとユーザーのインタフェースとなる基本的なソフトウェアですが、Linuxの操作では頻繁に利用します。
シェルにはいくつもの種類があり、機能性なども異なります。WEBブラウザでFirefox・Chromeを選べるように、シェルも利用者の目的に応じて変更可能です。
主要なシェルをご紹介します。
-
bash
bashはボーンアゲインシェルとも呼ばれます。
bashは1980年代にブライアン・フォックス氏とGNUプロジェクトによりボーンシェル(sh)のフリーな代替として開発されました。
ボーンシェル(sh)に対する後方互換性を持ちながら、多くの付加機能があり使いやすかったため、多くのLinuxで標準のシェルとして採用されました。現在ではmacOSのターミナルでも使用できます。
-
sh
shはボーンシェル、Bシェルとも呼ばれます。
1977年にアメリカの通信会社AT&Tでスティーブン・ボーン氏により開発されたUNIX系OSのためのシェルです。
他のシェルの元祖であり、現在でもいくつかのOSでは標準のシェルとして使用されています。
-
zsh
Zシェルとも呼ばれ、ボーンシェル(sh)を改良したシェルです。
他の多くのシェルを参考にして機能を取り入れ、オリジナルの機能も備えています。
プラグインとテーマをサポートしているためカスタマイズ性が高く、頻繁にシェルを利用する方に向いています。
-
csh
Cシェルは、1970年代にカリフォルニア大学のビル・ジョイ氏により開発されたUNIX系OSのためのシェルです。
Cシェル系とボーンシェル系(sh、bashなど)は異なる系統のシェルの一族で、Cシェルは名前のとおりC言語に似た文法の制御構造を備えるのが特徴です。C言語のプログラマーにとっては自然にシェルスクリプトを記述できるでしょう。
-
ksh
kshまたはコーンシェルは、1980年代後半にベル研究所のデビッド・コーン氏により開発されたUNIX系OSのためのシェルです。ボーンシェル(sh)との後方互換性とPOSIX規格への準拠をうたっています(POSIXは異なるOS間でソフトウェアの互換性・移植性を提供するための規格)。
kshは多くの機能があり、コマンドラインの編集、ジョブの制御、C言語に似た制御構造を持ち、ボーンシェル(sh)より動作が高速です。
bashやzshほど利用は多くありませんが、多くのUNIX系OSで利用できます。
-
シェルの重要性
Windowsなどに見られるGUI(グラフィカルユーザーインターフェース)はマウスとアイコンで操作でき、分かりやすくとっつきやすいですが、サーバーを実務で使う専門家にとってはシェルを使う文字ベースの操作に多くの利点があります。文字ベースのため、設定内容を文書化しやすく、同僚に伝えるのも容易です。
シェルは、OSと利用者の仲介をするソフトウェアで、利用者が端末(ターミナル、などとも呼ばれます)に入力した文字を解釈してOSの理解できる情報に変換し、OSに動作を要請します。OSが作動し、何らかのレスポンスがあれば、利用者が読めるようなテキストの形で端末に表示をします。
Linuxサーバーの管理操作は、シェルを通じてコマンドを入力、結果として表示される文字を見てまた次の操作を繰り返すのが基本です。
シェルとOSの連携例
例として、作業ディレクトリを取得する例を見てみましょう。
Linux系OSはディレクトリとファイルで構成されたファイルシステムが採用されています。
インターネットのURLの後半部分に見られるような「/home/foo/index.html」のような形式でファイルの存在する位置を特定できます。「/」はファイルとディレクトリの区切りを表しており、左記の例では「home」ディレクトリ内にある「foo」ディレクトリ内にある「index.html」ファイルを示しています。
作業ディレクトリとは、現在注目しているディレクトリのことで、例えば作業ディレクトリが「/home/foo」に設定されていれば単にファイル名index.htmlを入力するだけで「/home/foo/index.html」を特定できます。他のディレクトリに「index.html」が存在していても混同せず、正確にファイルを指定でき、記述を省略できるため便利です。
作業ディレクトリは適時変更できますが、たくさんのコマンド操作をしていると現在の作業ディレクトリを確認したくなる場合があります。
利用者とシェル、OSは次のように連携して動作します。図の上から下へ順に動作していきます。
- パソコンで端末を開く
- 端末で「pwd」コマンドを入力
- 端末への入力は、シェルに渡される
- シェルは「作業ディレクトリの取得」という内容を理解しOSの機能を呼び出す
- OS(カーネル)は作業ディレクトリの情報をシェルに応答
- シェルはテキスト形式で作業ディレクトリを表示
- 利用者は端末に表示された文字列で作業ディレクトリを知る
利用者は単に一つのコマンドを入力するだけですが、OSとの間でシェルが基盤となる役割を担っているのが分かります。
実行結果(例)は以下のようになります。「$」は入力を受け付けているとき表示されるプロンプトで、実際に入力するのは「pwd」のみです。
$ pwd /home/foo |
-
シェルの特徴とメリット
シェルはLinux系OSの管理をテキスト入力でおこなえるほか、シェルスクリプトを用意して業務を自動化できます。詳しく見ていきましょう。
-
コンパイル不要
シェルのコマンドをテキスト形式のファイルに保存しておけば、シェルスクリプトとして実行できます。
C言語やJavaのようにコンパイル(テキスト形式で書かれたプログラムを機械語に翻訳する手順)は不要なので、テキストエディタがあれば簡単にスクリプト内容の変更や加筆ができ、OSを問わずスクリプトをやりとりできるため再利用性が高いのが特徴です。
-
パソコン上の基本的な操作
サーバーOSの管理ではさまざまな操作が必要となりますが、よくおこなわれるのは、各種の記録を参照したり作成したりする操作です。
具体的には、WEBサーバーのログファイルを参照したり、バックアップの実施記録をつけたりしますが、いずれも基本的にはテキスト形式のファイルを操作すれば達成できます。
基本的な働きのコマンドをシェルの働きで組み合わせることで、利用者の必要とする複雑な条件での加工や抽出ができるのがシェルによる操作の特徴となっています。
例えば、テキストファイルを表示したり連結するには、次のコマンドが使用できます。
- cat……ファイルの中身を表示します。
- head……テキストファイルの冒頭の数行を表示します。
- tail……テキストファイルの末尾の数行を表示します。
必要な箇所を抽出するには、次のコマンドを使用できます。
- grep……ファイル内で特定のパターンに合う部分を抽出します。
- cut……ファイル内の指定した列やフィールドを抽出します。
- sort……ファイル内の行を昇順または降順で並び替えます。
- uniq……ファイル内の連続する重複行を除去します。
- split……ファイルを指定したサイズで分割します。
他の加工や変換は、次のコマンドがよく使用されます。
- sed……ファイル内のテキストを変換します。文字列置換や行の削除など。
- awk……ファイル内の指定フィールドを抽出したり、集計したりします。
- tr……ファイル内の文字を置き換えます。
各コマンドの使用例は以下のとおりです。
コマンド |
説明 |
$ cat error.log |
error.logファイルの内容を(すべて)表示します。 |
$ head access.log |
access.logファイルの冒頭10行を表示します。 |
$ tail -n 50 error.log |
error.logファイルの末尾50行を表示します。 |
$ grep -e ‘https?://’ error.log |
URLのような文字列を含む行を表示します。 |
$ cut -f 2-3 data.tsv |
タブ区切りテキストファイルdata.tsvの2、3列目を表示します。 |
$ sort -n -r id.txt |
各行に数値が記載されたid.txtファイルの行を大きい順に並び替えて表示します。 |
$ uniq id.txt |
id.txtファイルに連続した同じ内容の行があれば1行のみ、他はそのまま表示します。 |
$ split -l 10000 access.log |
access.logを1万行毎に分割したファイルを作ります。 |
$ sed ‘100,200s/foo/bar/’ in.txt |
in.txtの100から200行目にある文字列fooをbarに置き換えて表示します。 |
$ awk ‘$5>=10000{print}’ dir-list.txt |
dir-list.txtのスペースで区切られた5番目の列が1万以上の行を表示します。 |
$ tr a-z A-Z < english.txt |
english.txtの小文字のアルファベットを大文字に置き換えて表示します。 |
-
業務の自動化
シェルスクリプトを作成しておけば、同じコマンドを繰り返し実行できます。
例えば定期的にデータベース(MySQLまたはMariaDBで作成したもの)をバックアップする必要があるとします。
繰り返しのバックアップを自動化するシェルスクリプトを作成できます。例えば以下のようになります。
now=“$(date +’%Y%m%d_%H%M’)” filename=“db_backup_$now“.gz backupfolder=“/var/backup/db” fullpath_backup=“$backupfolder/$filename“ logfile=“$backupfolder/”backup_log_”$(date +’%Y_%m’)”.txt echo “DB backup started at $(date +’%Y-%m-%d %H:%M:%S’)” >> “$logfile“ mysqldump –user=mydbuser –password=mypass –default-character-set=utf8 mydatabase | gzip > “$fullpath_backup“ echo “DB backup finished at $(date +’%Y-%m-%d %H:%M:%S’)” >> “$logfile“ |
シェルスクリプトを定期的に実行するには、多くのLinux系OSに含まれるcrondソフトウェアが役立ちます。crondは指定のタイミングでシェルスクリプトや指定のプログラムを実行できます。
上記スクリプトを保存し、crondの設定ファイルを作成すれば、例えば毎晩3:50からバックアップを開始するよう設定できます。
-
作業の効率化が可能
複雑な手順の操作はシェルスクリプトにしておけば間違えずに実行できます。サーバー管理では、一台一台異なるサーバーのセッティングに対して、状況に応じたさまざまな操作を求められるため、カスタマイズしやすいシェルスクリプトは役立ちます。
perl・Ruby・Pythonのようなスクリプト言語を組み合わせて、より高度で大規模な業務手順をスクリプトとして作成・展開もできます。
また、gitやdockerなどのツールを導入しておくことで、開発やテストの工程でおこなわれる複雑な手順もカバーできるため、作業時間を短縮できます。
Shellにおける業務の自動化や作業の効率化の技術を身に着けることで、インフラエンジニアとしての転職を考える際に希望の企業の面接で評価が高くなる可能性も十分にございます。
インフラエンジニアを募集する求人の例は下記よりご確認ください。
-
シェルの基本的なコマンド
シェルスクリプトを実際に作成して、基本的な手順や制御構造をみてみましょう。
基本的なスクリプト
基本は拡張子を「.sh」としてテキストファイルを作成すればよいです。
単純な例は以下のようになります。
ファイル名:sample01.sh
echo “Hello, world.” |
実行するには、「sample01.sh」があるディレクトリで以下を端末から実行します(以下、行頭の「$」は入力行を表します。実際に入力するのは「$」より後ろの部分だけです)。
$ bash sample01.sh |
「sample01.sh」はシェルスクリプトですが、毎回bashコマンドを入力せず実行できるように、シェルスクリプトの最初の行に「shebang」と呼ばれる特別なコメント行を挿入しましょう(以下例では/usr/bin/bashとしていますがお使いの環境により異なる場合があります)。
ファイル名:sample02.sh
#! /usr/bin/bash echo “Hello, world.” |
次に、「sample02.sh」があるディレクトリで以下を一度実行します。「chmod」によって「sample02.sh」ファイルのモードが変わり、実行できるようになります。
$ chmod u+x sample02.sh |
モード変更後に、「sample02.sh」を実行するには以下のようにします。冒頭の「./」は現在の作業ディレクトリを表しており、ディレクトリ名を明示的に指定して実行します。
$ ./sample02.sh |
変数の利用
シェルスクリプトでは変数を作成できます。
変数には、スクリプトの作者が自由に定義できるものと、シェルによってあらかじめ設定されるものがあります。
変数名には、半角英数字とアンダースコア(_)が利用できますが、一部使えない名前もあります。
定義した変数は、スクリプト内でいくつかの方法で利用(展開)できます。
ファイル名:sample11.sh
#! /usr/bin/bash my_name=“Linux User” echo “Hello, ${my_name}.” |
- 2行目で文字列を新規変数「my_name」に代入しています。
- 3行目のechoのパラメータに${~}が含まれています。これらの記号はシェルスクリプトで「変数展開」と呼ばれるもので、変数の内容が該当箇所に入ります。
スクリプトを実行すると結果は以下のようになります。
$ bash sample11.sh Hello, Linux User. |
条件分岐
曜日によって処理を分ける例を見てみましょう。
例えば、シェルスクリプトを日曜日に実行した場合だけ、別のメッセージを表示するのは以下のようなスクリプトになります。
ファイル名:sample12.sh
#! /usr/bin/bash # 「#」で始まる行はコメントとなり実行に影響しません。 # A: 曜日の取得 weekday=$(date +%u) # B: 曜日による分岐 if [[ $weekday == 7 ]]; then # 条件が成立した場合に実行 echo “Go for a scenic walk!” else # 条件が成立しない場合に実行 echo “Work diligently.” fi |
2行目に記載のとおり、#で始まる行はコメント行であり実行されません(#より前の空白は許容されます)。シェルスクリプトにコメントを書いておくと後日変更するときなどに理解しやすくなります。
Aの次行では変数「weekday」に「date」コマンドの実行結果を代入しています。
- 「date」コマンドはさまざまな形式で日時を表示するコマンドです。例では形式%uを指定し、曜日を1から7の数字で表示するようにします。1が月曜日、2が火曜日です。
- 「$(~)」は「コマンド展開」と呼ばれるもので、コマンドの実行結果が該当箇所に入ります。例では右辺が曜日を表す数字となり、変数に代入されます。
Bの次行からはifと呼ばれるbashの複合コマンドが登場しています。
- 「if」は条件によって処理を振り分けます。条件が成立するかどうかを判定し処理が分岐します。
- 例では「[[ $weekday == 7 ]]」が条件で、「変数『weekday』の値が7と等しい」が成立するかどうかを判定します。
- 成立する(7と等しい)場合、続く「then」部が実行され、成立しない(7と等しくない)場合、「else」に続く部分が実行されます。
- 「if」のブロックは「fi」で終了し、以降のスクリプト処理が続行します。
実行例は以下のとおりです。(日曜日に実行すると結果は異なります)
$ bash sample12.sh Work diligently. |
-
まとめ
Linux系OSの操作に必須となるシェル(Shell)をご紹介しました。
- ・シェルはユーザーとOSの仲介をするソフトウェアで、シェルスクリプトはシェルのコマンドを記載したテキストファイルです。
- ・bashをはじめとする主要なシェルをご紹介しました。
- ・シェルはLinux系OSならすぐ利用でき、業務の効率化ができます。
- ・bashを例に基本的なコマンドとシェルスクリプトの記載方法をご紹介しました。
Linux系OSを操作する際や、macOSやWindowsのWSL環境でbashを利用する際に、シェルスクリプトを作成し、定型作業の自動化にトライしてみてはいかがでしょうか。
本記事ではShellについて解説してきました。Shellを扱う職種としてインフラエンジニアがあげられます。インフラエンジニアについて詳しく知りたい方は、下記の記事も参考にしてみてください。
関連記事:インフラエンジニアとは?仕事内容や転職で必要なスキルなど徹底解説
インフラエンジニアの平均年収は高い?スキルアップで高収入を目指す方法を解説
インフラエンジニアとは?仕事内容や転職で必要なスキルなど徹底解説