Linuxゲリラ戦記

if 私=金持ち then 世界を買う fi

48.シェルスクリプトにif文、exit。及び、wget

ナックス「人は、失敗しても何度もチャレンジを繰り返すことで成長することが出来るのです!!」

デビー君「おー。良い事言うねー」

ナックス「七転び八起き!!」

ナックス「100回ダメでも、101回目は成功するかもしれない!!」

ナックス「などという精神は腐ってる!!」

デビー君「えー!!なんでさ!?」

ナックス「人間は諦めが肝心です!!」

ナックス「例えばデビー君が赤い眼鏡の女の子にフラれつづけながらも100回プロポーズしたとしよう!」

ナックス「私は思う!」

ナックス「『貴様はストーカーかっ!!』」

ナックス「よしんば、彼女が101回目のプロポーズを受けたとしよう!!」

ナックス「私は思う!!」

ナックス「『彼女はきっと、デビー君の異常性を感じ取り『これ以上フリ続けるといつか逆恨みされて殺される』という命の危険を感じたんだろうな』と!!」

デビー君「えー……。じゃあ、ナックスは何回くらいの失敗であきらめると丁度良いと思うの?」

ナックス「1回です」

デビー君「多分、1回の失敗で諦めるような人はLinuxを使いこなせないと思うんだ……」

ナックス「聞いてくださいよ、デビー君。私は以前の回で、例として」

$ ./imageGet.sh 子猫

ナックス「みたいなやつを教えたんですよ。でもって、実際に自分でもやってみたんですよ」

ナックス「そしたら異様に時間がかかってしまって泣く泣くCtrlキーを押しながらCキーを押して強制終了させたんですよ」

ナックス「で、まぁ実行時に表示される内容を見てみたら、wgetが画像をうまく取得出来なくて、何度か挑戦してたみたいなんですよ」

ナックス「で、manコマンドでwgetの説明を見てみました」

$ man wget

ナックス「そしたらwgetの野郎、"アクセス不許可"と"ファイルが見つかりません(404)"エラー以外で画像が取得できない場合は、20回も画像の再取得に挑戦するらしいんですよ」

デビー君「頑張り屋さんのコマンドだね」

ナックス「いや、でも今回のプログラムではまだまだ他にも画像はいっぱいあるんだから、取れない場合はさっさと諦めてほしい……」

ナックス「というわけで、今回はwgetコマンドにオプションをつけて、再チャレンジなんか二度としないフヌけ野郎に変えます!!」

デビー君「なんか嫌な言い方だな……」

ナックス「wgetコマンドに、このようなオプションをつけることで、チャレンジする回数を変更できます」

$ wget -t チャレンジする回数

ナックス「今回は、二度と再チャレンジなどしません。よって、1を指定します」

$ wget -t 1

ナックス「というわけで、これを前提に、前回のシェルスクリプトを書き換えます」

#!/bin/sh

keyword=$1
keyword=`echo $keyword | nkf -wMQ | tr = %`
curl -e http://www.my-ajax-site.com \
        http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > ahaha.txt
wget -t 1 -i ahaha.txt
rm ahaha.txt

デビー君「wgetの所を書き換えたんだね」

$ wget -i ahaha.txt

デビー君「が」

$ wget -t 1 -i ahaha.txt

デビー君「になったんだね」

デビー君「複数のオプションをつけるときにはこうするのか……」

ナックス「いえ。複数のオプションのつけ方は色々あります。今回のはほんの一例です」

ナックス「これで、一度も再チャレンジしないで済むはずです。前回"子猫"を試して異様に時間がかかった人はもう一度やってみてください」

ナックス「そして今回はもう一つ」

デビー君「え?なに?」

ナックス「検索キーワードを指定し忘れたときに、"検索キーワードを指定してくれよ"的なメッセージを表示したいと思います」

デビー君「おー。少しずつ本格的なプログラムに変わっていきますなー」

ナックス「ちなみに現在。検索キーワードを指定せずに実行すると、以下の様になります」

$  ./imageGet.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   251    0   251    0     0   2334      0 --:--:-- --:--:-- --:--:--     0
ahaha.txt にはURLがありません。

ナックス「こいつを変えていきましょう」

ナックス「これには、コマンドでは無くシェルスクリプトで使われるif文で対応したいと思います」

デビー君「イフぶん?」

ナックス「そうです。 if は日本語に訳すと『もし〜ならば』となります。使い方は以下のような感じです」

if [私=金持ち]
then
        働かない
fi
if [私=金持ち]
then
        働かない
else
        仕方なく働く
fi
if [私=金持ち]
then
        働かない
elif [私=仕事が大好き]
then
        喜んで働く
else
        仕方なく働く
fi

ナックス「thenは日本語に訳すと『その場合は』。elseは日本語に訳すと『そうで無いならば』的な意味です」

ナックス「elifはelse ifを省略して表記しているのだと思います。意味は『そうでは無くて、もし〜ならば』という感じでしょうか」

デビー君「まぁ、なんとなくは分かる……かな」

ナックス「= は皆さんも感覚的に分かるように」

A=B
AがBならば

ナックス「と言う意味です」

ナックス「ちなみに != というのもあります」

A!=B
AがBで無いならば

ナックス「使い途は = と変わりません。例えばこんな感じに使います」

if [私!=カッコイイ]
then
        私は不幸
fi

ナックス「今回は、プレゼント(引数)が空だったら……つまり、$1に何も入っていなかったらエラーメッセージを出して終了するようにします」

ナックス「『変数が空の場合は……』という条件は以下の様に書くそうです」

if [ -z 変数 ]

ナックス「シェルスクリプトを途中で終了させるには exit と書きます」

exit

ナックス「というわけで、プログラムをこんな感じにしてみました」

#!/bin/sh

if [ -z $1 ]
then
        echo "検索キーワードを入れてください"
        echo "下記に例を示します"
        echo "\$ ${0} \"ペンギン 壁紙\""
        exit
fi

keyword=$1
keyword=`echo $keyword | nkf -wMQ | tr = %`
curl -e http://www.my-ajax-site.com \
        http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > ahaha.txt
wget -t 1 -i ahaha.txt
rm ahaha.txt

ナックス「今までのシェルスクリプトの上部分に以下の文章を追加しました」

if [ -z $1 ]
then
        echo "検索キーワードを入れてください"
        echo "下記に例を示します"
        echo "\$ ${0} \"ペンギン 壁紙\""
        exit
fi

デビー君「えっと一行目の」

if [ -z $1 ]

デビー君「はナックスの言う通り『$1が空だったら』 つまり、引数が指定されていなかったら、だっていうのは分かる」

デビー君「echoの一つ目の文章と二つ目の文章もまぁ、分かる」

デビー君「ただ、三つ目のechoが怪しいな……」

ナックス「そうですね。エスケープ処理をいくつか加えているので理解しにくいと思います。ちょっとエスケープ処理を取り除いてみますね」

echo "$ ${0} "ペンギン 壁紙""

デビー君「もしかしてこれ…… $0 っていう変数が使われてる?」

ナックス「ピンポーン。正解です。解説の前に、実際に検索キーワードを指定せずにシェルスクリプトを実行するとどうなるか見てみましょう」

$ ./imageGet.sh 
検索キーワードを入れてください
下記に例を示します
$ ./imageGet.sh "ペンギン 壁紙"

デビー君「え!!三つ目の文章ってこうなるの!?」

ナックス「はい。なります。では説明します。 $0 という引数の正体を!!」

シェルスクリプトの変数。$0には実行時の最初の文字が入る

ナックス「上記の絵をご覧ください。これは、aaa.shというシェルスクリプトを実行した場合の例です。aaa.shスクリプトを絵の様に実行した場合、自動的にシェルスクリプトに上記の様に変数が渡されます。$0には、シェルスクリプト実行時の一番最初のもの、つまりシェルスクリプト自身が入ります」

ナックス「半角スペースで区切ることで、引数をいくつでもシェルスクリプトに渡せます」

デビー君「へー!!引数ってこんな仕組みになってるのか!!」

ナックス「そうです。$0 を知ると、なんか『おぉ!』って感じになって、引数の仕組みが少し分かりますね」

ナックス「さて。次回こそきっと100個画像を集められる様にシェルスクリプト改造(49.ファイルへの追加書き込み・wgetのネットワークタイムアウトの設定)!!」

このエントリーをはてなブックマークに追加