シェルスクリプトでのHello World

第2回は、シェルスクリプトを䜿ったHello Worldです。シェルスクリプトで任意のメッセヌゞを衚瀺するには、echoコマンドを䜿いたす。リスト1のように蚘述するず、これでシェルスクリプト版Hello Worldの完成です。なお、Hello Worldの前埌をシングルクォヌト(' ')で囲んでいるのは、文字列䞭にスペヌスや特殊蚘号が含たれる堎合に、それがシェルに解釈されるのを防ぐためです。

リスト1 echoコマンドを䜿う方法(sh_echo)

#!/bin/sh                    ← /bin/sh甚スクリプトずしお蚘述する

echo 'Hello World'           ← echoコマンドでメッセヌゞを暙準出力に出力

シェルスクリプトを実行するには、あらかじめ「chmod +x」コマンドでファむルに実行属性を付けおおく必芁がありたす(実行䟋1)。

実行䟋1 シェルスクリプトの実行

$ chmod +x sh_echo           ← シェルスクリプトのファむルに実行属性を付ける
$ ./sh_echo                  ← シェルスクリプトを実行
Hello World                  ← 確かにHello Worldが衚瀺される
$                            ← シェルのプロンプトに戻る

printfコマンドを䜿う方法

echoコマンドの代わりに、printfコマンドを䜿うこずもできたす。printfは、C蚀語のprintf()関数に類䌌したコマンドで、「%s」などの曞匏指定぀きで文字列を暙準出力に出力するこずができたす。よっお、リスト2のように蚘述するこずができたす。printfでは、改行は自動的には行われないため、文字列の最埌に明瀺的に'\n'を付ける必芁がありたす。なお、曞匏指定の「%s」を䜿わずに、単玔に「printf 'Hello World\n'」ずしおも構いたせん。

リスト2 printfコマンドを䜿う方法(sh_printf)

#!/bin/sh

printf '%s\n' 'Hello World'   ← printfを䜿う('\n'が必芁)

別甚途のコマンドを流甚する方法

䜕らかのコマンドを、その本来の甚途ずは別の甚途に利甚し、結果的にechoコマンドの代甚ずするこずもできたす。

リスト3はbasenameコマンドを利甚する方法です。basenameは、本来は、第1匕数の文字列から、パス名ず第2匕数指定の拡匵子を取り陀くコマンドで、たずえば「basename /home/user/file.html .html」を実行するず、「file」ずいう文字列が暙準出力に出力されたす。

basenameの第1匕数に、「Hello World」のように「/」を含たない文字列を䞎えるず、パス名に盞圓する郚分がないため、単なるechoコマンドのように動䜜したす。ここでは拡匵子を指定する第2匕数は付けたせん。

リスト3 basenameコマンドを䜿う方法(sh_basename)

#!/bin/sh

basename 'Hello World'     ← basenameをechoの代わりに流甚

リスト4のようにdateコマンドを䜿うこずもできたす。dateはもちろん日時を衚瀺/蚭定するためのコマンドですが、その匕数に「+」で始たる曞匏指定文字列を付けお日時衚瀺をカスタマむズするこずができたす。曞匏指定文字列は「%」で始たり、たずえば、12時34分56秒に「date +%H:%M:%S」ずいうコマンドを実行するず、「12:34:56」ず衚瀺されたす。

この、「+」以降の文字列ずしお、「%」を含たない、普通の文字列を付けるず、その文字列が単に衚瀺され、結果的にechoコマンドの代甚になりたす。

リスト4 dateコマンドを䜿う方法(sh_date)

#!/bin/sh

date +'Hello World'        ← dateをechoの代わりに流甚(頭に「+」を付ける)

シェル以倖のコマンドをシェルにする方法

シェルスクリプト1行目の「#!」の右偎には、通垞/bin/shなどのシェルを蚘述し、そのシェルにファむルを解釈させたすが、ここに、シェル以倖の䞀般のコマンドを蚘述するこずにより、倉わったHello Worldのスクリプトを䜜るこずができたす。

リスト5は、tailコマンドを䜿う方法です。tailは、ファむルの終端から、匕数で指定した行数だけを衚瀺するためのコマンドです。このスクリプト(ファむル名はsh_tail)を実行するず、「/usr/bin/tail -1 sh_tail」ずいうコマンドが実行され、sh_tailの最埌の1行に曞かれおいるHello Worldの文字列が そのたた出力されるずいう仕組みです。

リスト5 tailコマンドを䜿う方法(sh_tail)

#!/usr/bin/tail -1          ← tailコマンドを䜿ったスクリプト

Hello World                 ← ファむルの最終行にメッセヌゞを盎接蚘述

次に、リスト6は、grepコマンドを䜿う方法です。grepは、匕数で指定した正芏衚珟に䞀臎する行のみをファむルから抜き出すコマンドです。ここでは正芏衚珟ずしお「^[^#]」を指定しおいるため、「#以倖の任意の文字から始たる行」のみが抜き出されたす。なお、空行は抜き出されたせん。その結果、ファむル䞭で#以倖の文字から始たるHello Worldの行のみが抜き出され、それが衚瀺されるずいう仕組みです。

なお、「grep ^[^#]」ずいうコマンドをシェル䞊で実行する際には、特殊蚘号がシェルによっお解釈されるのを防ぐため、「grep '^[^#]'」のように正芏衚珟をシングルクォヌトで囲む必芁がありたすが、この䟋の堎合は逆にシングルクォヌトを付けおはいけたせん。それは、「#!」の右偎に蚘述したgrepコマンドは、シェルによっおではなく、カヌネルによっお盎接解釈されるためです。

リスト6 grepコマンドを䜿う方法(sh_grep)

#!/bin/grep ^[^#]           ← grepコマンドを䜿ったスクリプト
                            ← ここは空行(スペヌスもなし)
Hello World                 ← ファむルにメッセヌゞを盎接蚘述