Linuxゲリラ戦記

初めてのプログラミング。

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

32.初めてのプログラミング補足/diffコマンドとTabキー

ナックス「はい。今日はハッカーアタックの初歩をやる予定でしたが──」

デビー君「え?何かあったの?」

ナックス「前回行った初めてのプログラムで『自分で手書きで書いてみたけど、プログラムが動かない』というメールが全国から殺到!」

デビー君「へー」

ナックス「などということはまったくもって皆無なのですが、まぁ今回は前回のプログラミングの補足をしたいと思います」

デビー君「してないんかい!」

ナックス「『おかしいなぁ……。指示どおりに書いているのに動かない。どこか写し間違えてるのかなぁ?』とは思っても、どこが写し間違えているか分からない!そんな時に使うのはdiffコマンド!」

デビー君「diffコマンド?」

ナックス「そうです。diffコマンドとは、2つのファイルを比べて、そのファイルに違いがあれば、違っている箇所を表示する、というコマンドです」

ナックス「使い方は以下の通り」

$ diff ファイル1 ファイル2

ナックス「さて、早速CUI環境を立ち上げましょう」

デビー君「立ち上げましたー」

CUIを起動する

ナックス「ありがとう。ですが、まずはCUIを無視して、普通にネットで前回の31.シェルスクリプトでプログラミング。Ctrl^Cで強制終了。のページを開いて、そこからプログラミングの書き方が書かれている部分をコピーします」

デビー君「コピー?」

ナックス「文字の部分を左クリックボタンを押したまま横(または縦)に動かすと、背景が青色に変わると思います。それは『今、この文字を選んでるよー』という意味です。その選ぶ範囲を、前回のプログラムのコード全部にしてください」

ソースコードを選択する

ナックス「全部選んだらその状態で右クリックをしてください。右クリックするとメニューが出てくるはずです。その中に『コピー』というメニューがあるはずなので、それを選んでください」

デビー君「──『コピー』をクリックしたけど、なにも起こらないよ?」

ナックス「それでいいんです。見た目には何も変化がありませんが、パソコンがその文字を記憶しています」

ナックス「では、CUI環境の方で新しくファイルを作りましょう。えーっと、ファイル名はmoto.txtにでもしますか」

$ nano moto.txt

nanoを起動する

ナックス「nanoが起動したら、そのCUIの画面上で右クリックをしてください。メニューの中に『貼り付け』または『ペースト』というような、メニューが出てくるはずですそれを選んでください」

デビー君「あ!さっきの範囲で指定してコピーした文字が勝手に書かれた!」

文字を貼り付ける

ナックス「そうです。コピーした文字を貼り付けたんです。これで、教科書どおりに書かれたテキストファイルが出来ました。いつもの様に保存してください」

Ctrlキーを押しながらOキーを押して保存。
名前は何でも良いです。上記の通りに操作したなら、moto.txtという名前が既に書かれていると思うので、そのままEnterキーを押してください。
Ctrlキーを押しながらXキーを押してnanoを終了してください。

ナックス「さて。後は、あなたが手書きで書いたcount.shと今回のmoto.txtをdiffコマンドで比べれば、どこに違いがあるかが分かります」

$ diff moto.txt count.sh

nanoを起動する

ナックス「ちなみに、実行結果の例としては、例えばa=`expr $a+ 1`のように、本当は$aと+の間にスペースを入れるべきなのにスペースが入っていない場合は以下の様に表示されます」

$ diff moto.txt count.sh 
7c7
<         a=`expr $a + 1`
---
>         a=`expr $a+ 1`

デビー君「おー。なるほど」

ナックス「ちなみに、7c7というのは7行目が違ってるよーってことだと思います」

デビー君「これで、次回から間違ってもdiffコマンド一発でどこが間違ってるかが分かるね」

ナックス「そうです。そして、補足その2!」

ナックス「前回のプログラムのソースコードなのですが」

#!/bin/sh

a=1
while [ $a -le 10 ]
do
        echo $a
        a=`expr $a + 1`
done

ナックス「doとdoneの間に挟まれている命令が、左側、スペースが空いているのが分かるでしょうか?」

デビー君「あ。そういえば空いてるね。何か意味はあるの?」

ナックス「実はこのスペース。無くても動くのですが『人間の見やすさのために』わざと空けているのです(余裕があればスペースなしで実行してみてください)」

デビー君「確かに、こう見るとどこからdoでどこまでdoneなのかが一目で分かるね」

ナックス「スペースをどこで空けるべきかはこれからプログラミングを勉強していけば自然と身につくのですが、今回知っていてほしいのは、スペースの作り方」

デビー君「スペースの作り方?スペースキーを押せば良いんでしょ?」

ナックス「いえ。実はプログラミングにおいては、見やすさのための空間(スペース)はTabキーで作ることが慣例となっています」

デビー君「Tabキー……って、あのCUI環境でファイル名とかディレクトリ名を補完してくれるあのTabキー?」

ナックス「そうです。Tabキーで、『程よい』スペースを書くことができます」

デビー君「へー」

ナックス「ただし、Tabキーでスペースキーいくつ分のスペースが作られるかは決まっていません。Linuxのディストリビューションや使うテキストエディタによって、スペースキー4つ分だったり6つ分だったり8つ分だったりします」

デビー君「え!統一されていないんだ!?」

ナックス「そうです。なので、あるパソコンから別のパソコンへファイルをコピーすると、スペース8つ分の空間だったのが4つ分に変わってしまったという話がしょっちゅうあります」

ナックス「この曖昧さを嫌って『程よいスペースをTabキーではなくスペースキーで作るべきだ派』も少数ながら存在します」

デビー君「うーん。確かにその人達の気持ちも分かるよ」

ナックス「が!まぁ私たちはまだプログラミング初心者ですので、当分の間は長い物に巻かれろ精神で多数派である『程よい空間はTabキーで作るべきだ』派になっておきましょう」

ナックス「次回!33.ハッキングあたーっく!wgetで情報を要求!