連載
» 2018年09月26日 05時00分 公開

“応用力”をつけるためのLinux再入門(23):シェルスクリプトに挑戦しよう(3)改行/空白/引用符のルール (1/2)

シェルスクリプトでは、単にコマンドを実行するだけではなく、条件によって処理を変えたり、繰り返し処理を行ったり、また、通常のコマンドのように引数を受け取って、引数に応じた処理を行ったりすることができます。

[西村めぐみ,@IT]
「“応用力”をつけるためのLinux再入門」のインデックス

“応用力”をつけるためのLinux再入門

改行/空白のルール

 本連載では、シェルスクリプトの基礎となる文法について解説します。今回は、シェルスクリプトの全体的な予備知識として、スクリプトを作る上で迷いやすい「改行」と「空白」「引用符(クオート)」の書き方、そして、ぜひ覚えておきたい「コメント」の書き方をまとめました。

 改行や空白、引用符のルールは、コマンドラインと同じです。ただし、シェルスクリプトの場合は「読みやすく」ということを念頭に置いて書くことが多いため、適宜空行を入れたり、行頭に空白を入れたりすることがあります。

●改行の入れ方

 シェルスクリプトは、原則として「」単位で処理されます。コマンドラインで[Enter]キーを押すところで改行するのが基本です。

 さらに、シェルスクリプトの場合、処理のブロックごとに改行(空行)を入れて読みやすくすることがあります。

 例えば、本連載第21回で解説した「Hello!」というメッセージを表示するシェルスクリプト「hello」に、「echo "World."」という行を追加して実行してみましょう。なお、helloの内容を変更しても、ファイルのパーミッション(許可属性)はそのままなので、「chmod」コマンドによる実行許可の付与は不要です。

#! /bin/bash
echo "Hello!"
▲「Hello!」というメッセージを表示するシェルスクリプト(ファイル名:hello)

#! /bin/bash
echo "Hello!"
echo "World."      ← この行を追加
▲コマンドの追加例(1)(helloを加工)

$ ./hello
Hello!             ← 1つ目のechoコマンドの実行結果
World.             ← 2つ目のechoコマンドの実行結果
▲実行結果

 この時、「echo」コマンドの前後に空行を入れても動作は同じです。

#! /bin/bash
   ← 空行を追加
echo "Hello!"
echo "World."
   ← 空行を追加
▲コマンドの追加例(2)(helloを加工)

$ ./hello
Hello!
World.
▲実行結果(空行の有無は実行結果に影響しない)

●空白の入れ方

 空白は、コマンドライン同様、コマンドや引数の区切りとして扱われます。空白は1つでも複数でも動作は同じで、行頭や行末に入れても構いません。

#! /bin/bash
    echo      "Hello!"
    echo      "World."
▲空白を追加した例(helloを加工)

$ ./hello
Hello!
World.
▲実行結果(コマンド前後の空白の有無は実行結果に影響しない)

 “処理のまとまり”ごとに改行を入れたり、空白を入れて文字の位置をそろえたりするなど、改行や空白をうまく入れることでスクリプトを読みやすくすることができます。

引用符(クオート)のルール

 シェルスクリプトの中の「ダブルクオート("〜")」「シングルクオート('〜')」および「エスケープ文字(\)」は、コマンドラインと同じように機能します。

●クオートとパス名展開

 「*」など、シェルにとって特別な意味を持つ記号を使う場合は、引用符の有無が実行結果に影響することがあります。

 例えば、スクリプトの中で「echo *」と書いた場合、「*」部分がカレントディレクトリにあるファイル名に置き換わります()。しかし、「echo "*"」あるいは「echo '*'」「echo \*」とした場合は、「*」という文字が表示されます。

【※】「ls *」と実行するとカレントディレクトリにある全てのファイルが一覧表示され、「ls sample*」と実行するとカレントディレクトリにある「sample」から始まるファイルが一覧表示されます。これはシェルの「パス名展開」という機能によるものです。パス名展開にはこの他「?」や「[〜]」記号を使用します。

 シェルで特別な意味を持つ記号としては、「|(パイプ)」「>(リダイレクト)」「!(ヒストリ、数字または「!!」という形で使用するので、「Hello!」のように末尾に使う場合は展開されない)」「&(バックグラウンド)」「()(サブシェル)」「;(コマンドの区切り)」「$(数字や変数名と共に使用する)」などがあります。



 動作の違いは、echoコマンドで簡単に確認できます。

#! /bin/bash
echo *
echo "*"
echo Hello!
echo "Hello!"
▲引用符の有無による違い(helloを加工)

 このシェルスクリプトを実行すると、1行目にはカレントディレクトリにあるファイルの一覧が、2行目には「*」という文字が、3行目と4行目には「Hello!」が表示されます。

$ ./hello
found.log hello mybackup mynl.awk sample.txt       ← カレントディレクトリにあるファイルやディレクトリが表示される(※)
*                  ← 引用符があるため「*」がそのまま表示されている
Hello!             ← 文字列がそのまま表示されている
Hello!             ← 文字列がそのまま表示されている
▲実行結果(hello)(※1行目の実行結果はカレントディレクトリにあるファイルによって変化します)

 「変数」を使用する場合には、引用符の有無によって動作が変わることがあります。変数については、次回あらためて取り上げます。

 本連載では、スクリプトの中でメッセージを表示する際など、「ここからここまでがひとまとまりの文字列である」と明確にするためにダブルクオートを使用しています。このように、引用符にはスクリプトが読みやすくなるという効果もあります。

●引用符(クオート)の種類

 特別な意味を打ち消すクオート(quoting)には、ダブルクオート("〜")を使う方法、シングルクオート('〜')を使う方法、エスケープ文字(\)を使う方法があります。

 ダブルクオート("〜")の場合、「$」「`」「!」以外の特殊文字の意味を打ち消します。「$」は変数名の参照(Linux基本コマンドTips 第113回参照)に、「`」はコマンド展開(Linux基本コマンドTips 第12回参照)に使用する記号です。

 「!」はヒストリに使用する記号ですが、「!!」または「!数字」という形で使用するため(本連載 第5回参照)、今回の「echo Hello!」のように末尾に書くような場合はクオートなしでも動作は変わりません。

●クオートの種類
記号 意味
\ シェルはこの後の1文字を展開しない
' ' シェルはこの中の全ての文字を展開しない
" " シェルはこの中の「$」「`」「!」を除く全ての文字を展開しない
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。