シェルスクリプトでは、単にコマンドを実行するだけではなく、条件によって処理を変えたり、繰り返し処理を行ったり、また、通常のコマンドのように引数を受け取って、引数に応じた処理を行ったりすることができます。
本連載では、シェルスクリプトの基礎となる文法について解説します。今回は、シェルスクリプトの全体的な予備知識として、スクリプトを作る上で迷いやすい「改行」と「空白」「引用符(クオート)」の書き方、そして、ぜひ覚えておきたい「コメント」の書き方をまとめました。
改行や空白、引用符のルールは、コマンドラインと同じです。ただし、シェルスクリプトの場合は「読みやすく」ということを念頭に置いて書くことが多いため、適宜空行を入れたり、行頭に空白を入れたりすることがあります。
シェルスクリプトは、原則として「行」単位で処理されます。コマンドラインで[Enter]キーを押すところで改行するのが基本です。
さらに、シェルスクリプトの場合、処理のブロックごとに改行(空行)を入れて読みやすくすることがあります。
例えば、本連載第21回で解説した「Hello!」というメッセージを表示するシェルスクリプト「hello」に、「echo "World."」という行を追加して実行してみましょう。なお、helloの内容を変更しても、ファイルのパーミッション(許可属性)はそのままなので、「chmod」コマンドによる実行許可の付与は不要です。
#! /bin/bash echo "Hello!"
#! /bin/bash echo "Hello!" echo "World." ← この行を追加
$ ./hello Hello! ← 1つ目のechoコマンドの実行結果 World. ← 2つ目のechoコマンドの実行結果
この時、「echo」コマンドの前後に空行を入れても動作は同じです。
#! /bin/bash ← 空行を追加 echo "Hello!" echo "World." ← 空行を追加
$ ./hello Hello! World.
空白は、コマンドライン同様、コマンドや引数の区切りとして扱われます。空白は1つでも複数でも動作は同じで、行頭や行末に入れても構いません。
#! /bin/bash echo "Hello!" echo "World."
$ ./hello Hello! World.
“処理のまとまり”ごとに改行を入れたり、空白を入れて文字の位置をそろえたりするなど、改行や空白をうまく入れることでスクリプトを読みやすくすることができます。
シェルスクリプトの中の「ダブルクオート("〜")」「シングルクオート('〜')」および「エスケープ文字(\)」は、コマンドラインと同じように機能します。
「*」など、シェルにとって特別な意味を持つ記号を使う場合は、引用符の有無が実行結果に影響することがあります。
例えば、スクリプトの中で「echo *」と書いた場合、「*」部分がカレントディレクトリにあるファイル名に置き換わります(※)。しかし、「echo "*"」あるいは「echo '*'」「echo \*」とした場合は、「*」という文字が表示されます。
【※】「ls *」と実行するとカレントディレクトリにある全てのファイルが一覧表示され、「ls sample*」と実行するとカレントディレクトリにある「sample」から始まるファイルが一覧表示されます。これはシェルの「パス名展開」という機能によるものです。パス名展開にはこの他「?」や「[〜]」記号を使用します。
シェルで特別な意味を持つ記号としては、「|(パイプ)」「>(リダイレクト)」「!(ヒストリ、数字または「!!」という形で使用するので、「Hello!」のように末尾に使う場合は展開されない)」「&(バックグラウンド)」「()(サブシェル)」「;(コマンドの区切り)」「$(数字や変数名と共に使用する)」などがあります。
動作の違いは、echoコマンドで簡単に確認できます。
#! /bin/bash echo * echo "*" echo Hello! echo "Hello!"
このシェルスクリプトを実行すると、1行目にはカレントディレクトリにあるファイルの一覧が、2行目には「*」という文字が、3行目と4行目には「Hello!」が表示されます。
$ ./hello found.log hello mybackup mynl.awk sample.txt ← カレントディレクトリにあるファイルやディレクトリが表示される(※) * ← 引用符があるため「*」がそのまま表示されている Hello! ← 文字列がそのまま表示されている Hello! ← 文字列がそのまま表示されている
「変数」を使用する場合には、引用符の有無によって動作が変わることがあります。変数については、次回あらためて取り上げます。
本連載では、スクリプトの中でメッセージを表示する際など、「ここからここまでがひとまとまりの文字列である」と明確にするためにダブルクオートを使用しています。このように、引用符にはスクリプトが読みやすくなるという効果もあります。
特別な意味を打ち消すクオート(quoting)には、ダブルクオート("〜")を使う方法、シングルクオート('〜')を使う方法、エスケープ文字(\)を使う方法があります。
ダブルクオート("〜")の場合、「$」「`」「!」以外の特殊文字の意味を打ち消します。「$」は変数名の参照(Linux基本コマンドTips 第113回参照)に、「`」はコマンド展開(Linux基本コマンドTips 第12回参照)に使用する記号です。
「!」はヒストリに使用する記号ですが、「!!」または「!数字」という形で使用するため(本連載 第5回参照)、今回の「echo Hello!」のように末尾に書くような場合はクオートなしでも動作は変わりません。
記号 | 意味 |
---|---|
\ | シェルはこの後の1文字を展開しない |
' ' | シェルはこの中の全ての文字を展開しない |
" " | シェルはこの中の「$」「`」「!」を除く全ての文字を展開しない |
Copyright © ITmedia, Inc. All Rights Reserved.