Linuxゲリラ戦記

シェルスクリプトを作っていくよ。

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

45.シェルスクリプトとはコマンドをまとめて書いたもの

ナックス「こんにちは。画像収集するシェルスクリプトを作ってみたい。今回は第10回」

デビー君「イエーイ」

ナックス「まず、41.ウェブサイトをダウンロードしてみるでダウンロードして、44.ダウンロードしたファイルに拡張子.htmlをつけてウェブブラウザで開いてみるでファイル名の末尾に.htmlをつけたファイルがあると思います」

デビー君「あるね」

ナックス「あれ、使わないから『rm imagesearch.php?q=公式壁紙&page=1.html』みたいにrmコマンドで消してくれる?」

$ rm imagesearch.php?q=公式壁紙&page=1.html

デビー君「使わないの!?」

ナックス「使わないよ」

ナックス「ちなみにrmコマンドを忘れている人は25.不要なファイルやディレクトリを削除する。rmコマンドをチェックだ!」

デビー君「分かった。消しておいた」

ナックス「よし。次に、みんなCUI環境を立ち上げてるなら最初はホームディレクトリにいるよね?」

デビー君「ホームディレクトリってCUI環境を立ち上げたら最初にいるところだよね?うん。いるよ」

ナックス「そこで『mkdir imagework』みたいにコマンドを打って、imageworkっていう名前のディレクトリを作ってくれる?」

$ mkdir imagework

デビー君「ホームディレクトリにimageworkっていう名前のディレクトリを作るんだね。オッケー」

ナックス「今後はこのimageworkディレクトリの中で画像収集するシェルスクリプトを作っていきたいと思います」

デビー君「はーい」

ナックス「というわけで『cd imagework』ってコマンドを打って、imageworkディレクトリの中に移動してくれる?」

$ cd imagework

デビー君「オッケー、移動しました」

ナックス「これから『imageget.sh』っていう名前でシェルスクリプトを作っていこうと思うんだけど」

デビー君「はい」

ナックス「プログラミング初心者の方は真面目に『このディレクトリ名じゃないとプログラムが動かないの?』とか『このファイル名じゃないとプログラム動かないの?』とか考えるかもしれないけど」

ナックス「プログラムのコードで大事なのは『imageget.sh』の中に書くコード自体なので、正直これから作るプログラムはディレクトリ名はimageworkじゃなくてもきちんと動く予定だし、ファイル名は正直imageget.shじゃなくてもきちんと動く予定です」

デビー君「そうなんだ」

ナックス「そうです。でも、かと言って他のディレクトリ名やファイル名で作ってしまうと、これから先の説明で混乱すると思うので、特にこだわりがないのであればディレクトリ名は『imagework』にしてファイル名は『imageget.sh』にしてくれると嬉しいです」

デビー君「はーい」

ナックス「さて、以前31.シェルスクリプトでプログラミング。Ctrl^Cで強制終了。で簡単なシェルスクリプトを作ったのを覚えてる?」

デビー君「うん。1から10の数字を表示するという何一つ面白くないプログラムを作った」

ナックス「なので皆さんはシェルスクリプトのことを『何かを計算するプログラムなのかな?』と思っているかもしれません」

ナックス「ですが、誤解を恐れずに言えば、シェルスクリプトは単にLinuxで使うコマンドをまとめて書くことができるだけのプログラムです」

ナックス「例えばシェルスクリプトのコードとして『ls』とだけ書いたシェルスクリプトを作ることができます」

ナックス「このシェルスクリプトを実行すると、何と!lsコマンドを実行してくれます!!」

デビー君「普通にlsコマンドを打った方が早くない?」

ナックス「他にも例えばシェルスクリプトのコードとして『cd ~』とだけ書いたシェルスクリプトを作ることができます」

ナックス「このシェルスクリプトを実行すると、何と!cd ~を実行してくれて、ホームディレクトリへ行けます!!」

デビー君「普通にcd ~コマンドを打った方が早くない?」

ナックス「さらには例えばシェルスクリプトのコードとして『ls』と『cd ~』の2つを書いたシェルスクリプトを作ることができます」

ナックス「このシェルスクリプトを実行すると、何と!lsコマンドを実行した後に、cd ~を実行してくれて、ホームディレクトリへ行けます!!」

デビー君「普通にlsコマンド打って、cd ~コマンドを打った方が早くない?」

ナックス「という感じで、シェルスクリプトのこと、何となく分かりましたか?」

デビー君「何となく分かった」

ナックス「よし。では実際に41.ウェブサイトをダウンロードしてみるでやったことと、全く同じことをシェルスクリプトでやってみましょう」

ナックス「今、imageworkディレクトリにいますよね?」

デビー君「います」

ナックス「『nano imageget.sh』とコマンドを打ってください。imageget.shというファイル名を指定しながらnanoを起動することができます」

$ nano imageget.sh

nanoを起動する

nanoが起動する

ナックス「中に、以下のように記述してください」

#!/bin/sh
wget "https://linuxgerira.com/imagesearch.php?q=%E5%85%AC%E5%BC%8F%E5%A3%81%E7%B4%99&page=1"

ナックス「シェルスクリプトを作るときは、1行目に『#!/bin/sh』という謎の呪文を書くのでした。忘れてる人は31.シェルスクリプトでプログラミング。Ctrl^Cで強制終了。を参考にしてね」

ナックス「2行目には41.ウェブサイトをダウンロードしてみるで打ったコマンドと全く同じコマンド『wget "https://linuxgerira.com/imagesearch.php?q=%E5%85%AC%E5%BC%8F%E5%A3%81%E7%B4%99&page=1"』を書いています。ちなみに41.ウェブサイトをダウンロードしてみるで説明した通り、検索キーワードは好きなキーワードを使って良いし、アドレスも一文字一文字書くのではなくてコピペでいいです」

nanoでコードを書く

ナックス「書けたら、Ctrlキーを押しながらO(オー)キーを押した後にEnterキーを押してファイルを保存し、Ctrlキーを押しながらXキーを押してnanoを終了してください」

ナックス「次に『chmod u+x imageget.sh』というコマンドを打ってimageget.shファイルに実行権限をつけて、実行できるようにします」

$ chmod u+x imageget.sh

デビー君「実行権限って何だっけ?」

ナックス「実行権限を忘れている人は29.ファイルのアクセス権限を変更しよう。chmodコマンドとか31.シェルスクリプトでプログラミング。Ctrl^Cで強制終了。を参考にしてね」

ナックス「最後に『./imageget.sh』とコマンドを打ってシェルスクリプトを実行してみてください」

$ ./imageget.sh

ナックス「実行したら41.ウェブサイトをダウンロードしてみると同じようにサイトのコードがダウンロードできます。『ls』コマンドで確認してみてね」

$ ls

lsコマンドで確認

デビー君「おー。ほんとだ」

ナックス「というわけで、今後このシェルスクリプトの中身を少しずつ書き換えて画像収集スクリプトを作るのですが、実はスクリプトという形じゃなくて直接コマンドを打ってもある程度同じことができるよ、っていうことを覚えていてね」

デビー君「はーい」

ナックス「次回、46.ファイル名を指定してダウンロードしてみる