シェルスクリプトはシェル上で動作する簡易プログラムのことです。複数のコマンドを条件分岐や繰り返し構文等の中で使用し、一連の処理を実現します。
シェルスクリプトの具体的な説明の前にまずシェルについて説明します。
シェルとはLinuxなどのUNIX系OSを操作するときに使用するコマンドラインインターフェイスを指し、ユーザーはシェルに対してコマンドを入力することでOSを操作することができます。
例えば、カレントディレクトリを返すpwdコマンドの実行時を考えてみます。
$ pwd
コマンドライン上で上記のように入力しEnterキーを押すと、pwdコマンドはシェルに渡されます。
シェルはpwdコマンドに対する処理をカーネル(UNIX系OS本体)に実行するように依頼します。
そして最後に、カーネルから受け取った実行結果をコマンドライン上に出力します。
$ pwd /home/user01
シェルにはさまざまな種類がありそれぞれが特徴を持っています。
B ShellとC Shellがベースとなり、様々なシェルが派生していきました。B Shellは単にshと呼ばれます。
現在使われている主要なシェルを以下に示します。
sh(B Shell、Bourne Shell)
最も基本的なシェル。ほぼすべてのUNIX系OSにインストールされている。
パイプ、ヒアドキュメント、コマンド置換、変数、ワールドカードによるファイル名指定などの機能が他の全てのシェルに共通する機能の出発点となった。
csh(C Shell)
BSD系のUNIXに多く採用されているシェル。C言語をモデルとして制御構造や式の文法を設計している。
C Shellには様々な対話用コマンドがあり、対話型の端末で使用することを第一に考えて設計されている。そのため、スクリプト言語としてはあまり使われない。
bash(Bourne-Again Shell)
B Shellの機能拡張版。B Shellとの互換性を持つ。
GNUプロジェクトの一環でB Shellのオープンソース版として開発。多くのLinuxディストリビューションやMacOSでデフォルトのシェルとされている。
ash
B ShellのBSDライセンス版として開発。小さいので、リソースが少ない環境でよく使われている。
zsh(Z Shell)
最も機能が豊富なシェル。sh、ash、bash、csh、ksh、tcshの上位互換相当の機能を持つ。
ksh
ベル研究所で開発。対話モードでは、コマンド行をテキストエディタを使うように操作できるのが特徴。vi互換モードとemacs互換モードとXEmacs互換モードが選択できる。IBM AIXなどのデフォルトシェルにもなっている。
ログインシェル
Linuxにログインすると自動的にいずれかのシェルが起動します。そのシェルのことをログインシェルと言います。
ログインシェルはLinuxの場合であれば、/etc/passwdにユーザアカウント情報と一緒に記載されていますので、一度確認してみてください。
また、起動したシェルによって動作が少し変わります。例えば、bashなら読み込む設定ファイルが増えたり、起動したコマンドの扱い(コマンドの引数等)が変わったりします。詳細は各シェルのmanページから参照できます。
シェルの組み込みコマンド
Linuxには様々なコマンドが用意されていますが、そうしたコマンドの中でも、プログラムの実体が/usr/sbinや/usr/binの中に存在しない、シェルの組み込みコマンド(またはビルトインコマンド)と呼ばれるコマンドがあります。
例えば、条件式やループを処理するif、for、while、変数を処理するsetやexportなどがあります。
シェルで提供される組み込みコマンドの一覧は、コマンドプロンプトでhelpと実行すると確認できます。
# help GNU bash, version 4.1.2(1)-release (i386-redhat-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. job_spec [&] history [-c] [-d offset] [n] or hist> (( expression )) if COMMANDS; then COMMANDS; [ elif C> . filename [arguments] jobs [-lnprs] [jobspec ...] or jobs > : kill [-s sigspec | -n signum | -sigs> [ arg... ] let arg [arg ...] [[ expression ]] local [option] name[=value] ... alias [-p] [name[=value] ... ] logout [n] bg [job_spec ...] mapfile [-n count] [-O origin] [-s c> bind [-lpvsPVS] [-m keymap] [-f filen> popd [-n] [+N | -N] break [n] printf [-v var] format [arguments] builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir] caller [expr] pwd [-LP] case WORD in [PATTERN [| PATTERN]...)> read [-ers] [-a array] [-d delim] [-> cd [-L|-P] [dir] readarray [-n count] [-O origin] [-s> command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] or> compgen [-abcdefgjksuv] [-o option] > return [n] complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in WORDS ... ;] do COMM> compopt [-o|+o option] [-DE] [name ..> set [--abefhkmnptuvxBCHP] [-o option> continue [n] shift [n] coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...] declare [-aAfFilrtux] [-p] [name[=val> source filename [arguments] dirs [-clpv] [+N] [-N] suspend [-f] disown [-h] [-ar] [jobspec ...] test [expr] echo [-neE] [arg ...] time [-p] pipeline enable [-a] [-dnps] [-f filename] [na> times eval [arg ...] trap [-lp] [[arg] signal_spec ...] exec [-cl] [-a name] [command [argume> true exit [n] type [-afptP] name [name ...] export [-fn] [name[=value] ...] or ex> typeset [-aAfFilrtux] [-p] name[=val> false ulimit [-SHacdefilmnpqrstuvx] [limit> fc [-e ename] [-lnr] [first] [last] o> umask [-p] [-S] [mode] fg [job_spec] unalias [-a] name [name ...] for NAME [in WORDS ... ] ; do COMMAND> unset [-f] [-v] [name ...] for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done function name { COMMANDS ; } or name > variables - Names and meanings of so> getopts optstring name [arg] wait [id] hash [-lr] [-p pathname] [-dt] [name > while COMMANDS; do COMMANDS; done help [-dms] [pattern ...] { COMMANDS ; }