Linuxゲリラ戦記

$ echo "私はあなたを愛しています”
Error: そんなセリフは言いたくありません。

左を向いているペンギンみたいなキャラクター、ナックス

30.シェルスクリプトでプログラミングする前の予習。echoコマンド。exprコマンド。\によるエスケープ処理。

ナックス「はい。というわけで今日はプログラミングに初挑戦してみよう」

デビー君「おー。なんだか『Linux使ってるぜ!』っていう感じになるね」

ナックス「プログラミング言語にはC言語やC++言語、Perlなどがあります。他にもネットワークプログラミング、ウェブプログラミングなどさまざまな種類のものがあるのですが、今回はLinuxユーザーならぜひとも知っておきたいシェルスクリプトという種類のプログラミングを作成したいと思います」

デビー君「シェル…って、bashとかのあのシェル?」

ナックス「そうです。CUI環境のあのシェルです」

デビー君「一体どんなプログラムを作るの?」

ナックス「初めてのプログラミングということで、難しいのは作れません。というわけで、最終的には数字の1から10までを表示するという何一つ面白くないプログラミングを作成します」

デビー君「本当に何一つ面白くなさそうだな……」

ナックス「シェルスクリプトとは!複数のコマンドを組み合わせてひとつのものにしてしまうもの!です」

ナックス「まぁ、とりあえず早速CUI環境を立ち上げちゃいなよ」

CUIを立ち上げよう

デビー君「立ち上げちゃったよ」

ナックス「今回は、まず最初に新しいコマンド。echoをお教えします。次のようにコマンドを打ってみてください」

$ echo "いえーい"

ナックス「日本語の所だけ全角で、後は半角です」

ナックス「結果はこうなります」

$ echo "いぇーい"
いぇーい

いぇーいと表示される

ナックス「そう。なんとechoコマンドは、echoの後に指定した文字を表示するという今までに無い革新的なコマンド!」

デビー君「……どうしよう。こんなに使い道の無いコマンドは初めてだ……」

ナックス「さて。ここからちょいとプログラミングっぽいことをします」

デビー君「え?早速?」

ナックス「まずはこんなコマンドを打ちます」

$ a=2

aという名前の箱に2を入れる

デビー君「a=2っていうコマンドを打つの?っていうか、これってコマンド?実行しても何もならないけど?」

ナックス「次にこんなコマンドを打ちます」

$ echo $a

デビー君「echo $aってうつの?」

ナックス「そうです」

$ echo $a
2

aの中身の2が表示される

デビー君「あれ?2って表示されてる」

ナックス「そうなんです。実はa=2という操作は、『aという名前の入れ物に2を入れたよ』っていうことなんです」

ナックス「この時」

$echo a

ナックス「とコマンドを打つとaという入れ物ではなく、文字のaが表示されます」

$echo a
a

ナックス「echoコマンドのときにきちんと『入れ物』ということを明示するために、aの中身を取り出すときは$aとしなければならないのです」

デビー君「へー。でもaという名前の入れ物に2を入れるときは」

$ $a=2

デビー君「じゃなくて」

$ a=2

デビー君「なんだ……。なんだかややこしいなぁ」

ナックス「そうです。プログラミングのややこしさは『人はなぜ恋をするのか』と言う問題と同じくらいにややこしいのです。さて、さらに教えるはexprコマンド!以下のように打ってみてください」

$ expr 1 + 2

ナックス「1と+と2の間にそれぞれ半角でスペースを空けるのを忘れないで!」

デビー君「スペース?」

ナックス「何も文字が書かれていない空白のことです。キーボードの手前側にやけに横長なボタンがあると思います。それがスペースキー。空白を作るためのボタンです。それを押せば、スペース(空白)が書き込めます」

1+2の結果が表示される

$ expr 1 + 2
3

デビー君「おぉ。1+2の結果の3が表示される」

ナックス「exprコマンドはシェル画面上で計算をするためのコマンドです」

ナックス「プログラミングの世界では足し算は + で。引き算は - で。掛け算は * で。割り算は / で。さらに剰余算は % で表現します」

ナックス「使い方はこんな感じです」

$ expr 1 + 2
$ expr 3 - 1
$ expr 2 * 6
$ expr 8 / 2
$ expr 7 % 2

ナックス「それぞれ試してみてください」

デビー君「お。掛け算だけエラーが出てしまった……」

ナックス「そうです。掛け算の*のマーク。どこかで見覚えはありませんか?」

デビー君「えーっと……。あ。お花マーク?」

ナックス「そうなんです。普通に*を使うと、シェルは26.Linuxで使うお花マーク*とtouchコマンドで教えた正式名称アスタリスクの正規表現と受け取ってしまうのです。なので、エラーになります」

デビー君「じゃあ、シェルでは掛け算はできないの?」

ナックス「いいえ。*の前に、バックスラッシュ『\』を書くことで『これは特殊な意味の*ではありません。普通の文字として扱ってください』という意味になり、掛け算が出来ます」

$ expr 2 \* 6

デビー君「\の文字はどうやって出すの?」

ナックス「キーボードの右側。Enterキーの斜め左画面側に円マーク¥のキーがあります。それを押すと\が出てきますよ」

デビー君「えい。あれ、本当に出た。キーボードには\なんて書いてないのに」

ナックス「考えてみれば、パソコンは英語圏生まれで、なおかつ円以外にユーロやらウォンやらあるはずなのに、日本のお金のマークである¥マークがキーボードから入力出来るっておかしくありませんか?実は、キーボードから¥マークを入れらるのはWindowsの日本語バージョンのみです。Linuxは世界標準なので¥マークではなく\が出るのです」

デビー君「なるほど」

ナックス「ちなみに\で『この直後に出てくる文字は特別な意味を持たないですよ。ごくごく普通の文字として扱ってください』とする方法のことを『エスケープ処理』と言います。覚えておいてね」

デビー君「はーい」

デビー君「それと、最後の剰余算ってなに?」

ナックス「剰余算とは、割り算の余りを出す式です」

デビー君「割り算の余り?そんなもの使うことあるの?」

ナックス「プログラミングと関係ない生活を送っているとまったく使うことは無いですが、プログラミングの世界では結構使います。使い道等も後々説明できればいいな、と思っております」

ナックス「さて、今回の最後はこんな感じで」

$ expr 7 + $a

7+$aの結果が表示される

$ expr 7 + $a
9

デビー君「あれ?なんで9になるんだろう?」

ナックス「さっき、aという名前の入れ物に2を入れたのを覚えているでしょうか?つまり」

$ expr 7 + $a

ナックス「は」

$ expr 7 + 2

ナックス「になります」

デビー君「あ、なるほど。僕はてっきり」

$ echo $a
2

デビー君「っていう操作のときに、なんとなくなイメージだけど『aという名前の入れ物から、2という中身を取り出した』……つまり、aという名前の入れ物が空っぽになったんじゃないかと思ったんだけど……」

ナックス「あー、なるほど。echoは純粋に中身を表示するだけで、中身を取り出すわけではありません。ちなみに、先ほどのaという入れ物ですが、」

$ a=5

ナックス「という操作で中身を上書きして5にできます。」

$ echo $a
5

aという入れ物は上書きできる

ナックス「ちなみに、入れ物の名前は自分で好きな名前をつけていいです。特に『こういうルールで名前をつけろ』という制限は(文法的/または他のコマンドと齟齬が置きそうな名前にはありますが)基本的にはありません」

$ watashi="erai"
$ baka="aho"
$ beautiful="durty haert"
$ echo $watashi
erai
$ echo $baka
aho
echo $beautiful
durty haert

変数の名前にルールは無い

ナックス「ちなみに、この入れ物のことを専門用語で変数(へんすう)と言います。変数はどのプログラミング言語でも出てくる重要な概念です。ぜひ覚えましょう」

デビー君「はーい」

ナックス「あと、この変数に入れた値は一時的なもので、CUI環境を再起動すると、すべてクリアされます。つまり、一番最初の、変数に何も値が設定されていない状態。余裕がある人は試しにCUI環境を一度閉じて、もう一度開いて」

$ echo $a

ナックス「としてみてください。何も表示されないのが確認できるはずです」

デビー君「はーい。あと、ちょっと気になるんだけど、一番最後のdurty haertって、英語間違ってない?」

ナックス「うん。きっと間違ってる。でも、直すのも面倒くさいし、英語の授業じゃないし。気にしないで」

ナックス「さて、プログラミングをする前の軽いストレッチのつもりでしたが、意外と分量があったので、続きは次回(31.シェルスクリプトでプログラミング。Ctrl^Cで強制終了。)!」

デビー君「え?今回のはプログラミングじゃないの?」

ナックス「今回はどちらかというと新しいコマンドの解説でしたね」