BASHの初心者ガイド - 条件と変数

前書き

「BASH初心者ガイド」の第3部へようこそ。 前の2つの記事を忘れてしまった場合は、このガイドを他のBASHスクリプティングガイドとどのように異なるものにするかを知りたいでしょう。

このガイドは、BASHの完全な初心者によって書かれています。 私はBASHの初心者ですが、ソフトウェア開発の背景から来ていますが、私が書いたことのほとんどはWindowsプラットフォーム向けです。

最初の2つのガイドは、次のサイトを参照してください。

BASHスクリプティングが初めての方は、最初の2つのガイドを読むことをお勧めします。

このガイドでは、条件文を使用してユーザー入力をテストし、スクリプトの機能を制御する方法について説明します。

rsstailをインストールする

このガイドに従うには、rsstailというコマンドラインアプリケーションをインストールして、 RSSフィードを読む必要があります

Debian / Ubuntu / Mintベースの配布を使用している場合、次のように入力します:

sudo apt-get install rsstail

Fedora / CentOSの場合は次のように入力します:

yum install rsstail

openSUSEの場合、次のように入力します:

zypper install rsstail

IFステートメント

ターミナルを開き、次のように入力してrssget.shというファイルを作成します。

sudo nano rssget.sh

ナノエディタ内で次のテキストを入力します。

#!/ bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml

CTRLとOを押してファイルを保存し、CTRLとXを押して終了します。

次のように入力してスクリプトを実行します。

sh rssget.sh

スクリプトは、linux.about.comのRSSフィードからタイトルのリストを返します。

1つのRSSフィードからタイトルを取得するだけで、Linux.about.comのRSSフィードのパスを覚えておく必要がなくなるので、あまり有用なスクリプトではありません。

nanoでrssget.shスクリプトを開き、次のようにファイルを編集します。

#!/ bin / bash

if [$ 1 = "verbose"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

次のように入力してスクリプトを再実行します。

sh rssget.sh verbose

今回は、RSSフィードにタイトル、リンク、説明が表示されます。

スクリプトを細かく分析してみましょう:

#!/ bin / bashはすべてのスクリプトに記述されています。 次の行は、基本的にユーザーが提供する最初の入力パラメーターを調べ、それを単語 "verbose"と比較します。 入力パラメータと "verbose"という単語が一致する場合、 thenfiの間の行が実行されます。

上記のスクリプトには明らかに欠陥があります。 入力パラメータをまったく指定しないとどうなりますか? 答えは、予期しないオペレータの行に沿ってエラーが発生することです。

もう一つの大きな欠点は、あなたが "冗長"という言葉を与えなければ、何も起こらないということです。 理想的には、verboseという単語を指定しないと、スクリプトはタイトルのリストを返します。

nanoを再度使用してrssget.shファイルを編集し、次のようにコードを修正します。

#!/ bin / bash

if [$ 1 = "verbose"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi

ファイルを保存し、次のように入力して実行します。

sh rssget.sh verbose

タイトル、説明、リンクのリストが表示されます。 次のように再度実行します。

sh rssget.shのタイトル

今回はタイトルの一覧が表示されます。

スクリプトの余分な部分は4行目にあり、 else文が導入されています 。 基本的に最初のパラメータが "verbose"という単語であれば、RSSフィードの説明、リンク、タイトルを取得できますが、最初のパラメータが何か他のものであればタイトルのリストを取得するだけです。

スクリプトは若干改善されましたが、まだ欠陥があります。 パラメータを入力しなかった場合でも、エラーは発生します。 パラメータを指定しても、冗長表示したくないと言っても、タイトルだけが必要なわけではありません。 あなたは例として間違った綴りをしているだけかもしれませんし、もちろん無意味な鳩をタイプしているかもしれません。

これらの問題を解決する前に、IF文と一緒にもう1つコマンドを表示したいと思います。

rssget.shスクリプトを次のように編集します。

#!/ bin / bash

if [$ 1 = "all"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "description"]
次に
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi

私は冗長という言葉を取り除き、それをすべてと置き換えることにしました。 それは重要な部分ではありません。 上のスクリプトは、ELSE IFの短い方法であるelifを紹介しています。

スクリプトは次のように動作します。 sh rssget.shを実行すると、説明、リンク、タイトルがすべて取得されます。 代わりにsh rssget.shの説明を実行すると、タイトルと説明だけが表示されます。 他の単語を指定すると、タイトルのリストが表示されます。

これは、条件文のリストをすぐに思いつく方法を導入する。 ELIFを実行する別の方法は、ネストされたIF文として知られているものを使用することです。

次に、ネストされたIF文の動作を示す例を示します。

#!/ bin / bash

if [$ 2 = "aboutdotcom"]
次に
if [$ 1 = "all"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "description"]
次に
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
else
if [$ 1 = "all"]
次に
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
次に
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
fi

気に入ったらrssget.shファイルにコピーして貼り付けてください。

上記のスクリプトでは、RSSフィードの "about.com"または "lxer.com"のいずれかを選択できる2番目のパラメータを紹介しています。

これを実行するには、次のように入力します。

sh rssget.sh all aboutdotcom

または

sh rssget.sh all lxer

もちろん、すべてを説明やタイトルに置き換えて、説明やタイトルだけを提供することもできます。

基本的に上記のコードでは、2番目のパラメータがaboutdotcomの場合、2番目のパラメータがlxerならば前のスクリプトと同じものである2番目のif文を参照し、内部のif文を再度参照して、タイトル、またはすべて。

このスクリプトは、純粋にネストされたIFステートメントの例として提供されており、そのスクリプトには非常に多くのものがあり、それらをすべて説明する別の記事があります。 主な問題は、スケーラブルではないということです。

Everyday Linux UserやLinux Todayなどの別のRSSフィードを追加したかったとします。 スクリプトが膨大になり、内側のIF文を変更することを決めた場合は、複数の場所で変更する必要があります。

入れ子にされたIFのための時間と場所がありますが、それらは控えめに使用する必要があります。 ネストされたIFをまったく必要としないように、通常はコードをリファクタリングする方法があります。 私は今後の記事でこのテーマに着きます。

ダフパラメータを入力する人々の問題を修正する方法を見てみましょう。 たとえば、上記のスクリプトで、ユーザーが第2パラメータとして「aboutdotcom」以外を入力すると、ユーザーがlxerを入力するかどうかにかかわらず、LXERのRSSフィードから記事のリストが表示されます。

さらに、ユーザが第1パラメータとして「すべて」または「記述」を入力しない場合、デフォルトは、ユーザが意図したものであってもなくてもよいタイトルのリストである。

次のスクリプトを見てください(またはrssget.shファイルにコピーして貼り付けてください)。

#!/ bin / bash

if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
次に
if [$ 1 = "all"] || [$ 1 = "description"] || [$ 1 = "タイトル"]
次に
if [$ 2 = "aboutdotcom"]
次に

if [$ 1 = "all"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "description"]
次に
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
else
if [$ 1 = "all"]
次に
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
次に
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
fi
fi
fi

最初に注意しなければならないのは、スクリプトがかなり大きくなっていることです。コントロールネストされたIF文がどのようになっていないのかをすぐに知ることができます。

このスクリプトで重要なのは、IF文です。 ステートメント2行目と4行目のTHENセクション。

|| ORを表す。 だから、 もし[$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]は、第2パラメータが "aboutdotcom"か "lxer"かどうかをチェックします。 そうでない場合は、最も外側のIFの else文がないため、IF文が完了します。

同様に、行4では、行 が[$ 1 = "all"] || [$ 1 = "description"] || [$ 1 = "title"]は、最初のパラメータが "all"か "description"か "title"のどちらかと等しいかどうかをチェックします。

ユーザーがsh rssget.sh potato cheeseを実行すると、LXERからタイトルのリストを受け取る前に、何も返されません。

|の反対 &&です。 &&演算子はANDを表します。

スクリプトを悪夢のように見せるようにしますが、ユーザーが2つのパラメータを提供していることを確認するために重要なチェックを行います。

#!/ bin / bash

if [$#-eq 2]
次に

if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
次に
if [$ 1 = "all"] || [$ 1 = "description"] || [$ 1 = "タイトル"]
次に
if [$ 2 = "aboutdotcom"]
次に

if [$ 1 = "all"]
次に
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "description"]
次に
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
else
if [$ 1 = "all"]
次に
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
次に
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
rsstail -u http://z.about.com/6/o/m/linux_p2.xml
fi
fi
fi
fi
fi

そのスクリプトで余分な唯一のビットは、次のような別の外部IF文です: if [$#-eq 2] 。 入力パラメータについての記事を読むと、$#は入力パラメータの数のカウントを返します。 -eqはequalsを表します。 したがって、IF文はユーザーが2つのパラメータを入力したかどうかを確認し、入力しなかった場合は何もせずに終了します。 (あまり親切ではない)。

私はこのチュートリアルがかなり大きくなっていることを知っています。 今週はそれ以上のものはありませんが、私たちが終了する前にスクリプトを整理するのを手伝っていきたいと思います。

条件文について学ぶ必要がある最後のコマンドは、CASE文です。

#!/ bin / bash


if [$#-eq 2]
次に
ケース$ 2 in
aboutdotcom)
case $ 1 in
すべて)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
説明)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
タイトル)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
エッサック
;;
lxer)
case $ 1 in
すべて)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
説明)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
タイトル)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
エッサック
;;
エッサック
fi

case文は、IF ELSE IF ELSE IF ELSE IFの場合より優れた方法です。

例えば、この論理

IF果物=バナナ
その後、これ
ELSE IF果物=オレンジ
その後、これ
ELSE IFフルーツ=ブドウ
その後、これ
END IF

次のように書き直すことができます。

ケースフルーツの
バナナ)
これを行う
;;
オレンジ)
これを行う
;;
ブドウ)
これを行う
;;
エッサック

基本的には、ケースの後の最初のアイテムは、あなたが比較しようとしているもの(すなわちフルーツ)です。 角括弧の前の各項目は、比較しているもので、それが前の行に一致する場合です。 実行されます。 大文字小文字のステートメントは、逆のesacで終了します(大文字と小文字が区別されます)。

rssget.shスクリプトでは、case文がその酷いネスティングのいくつかを削除しますが、十分に改善されていません。

スクリプトを実際に改善するには、変数を紹介する必要があります。

次のコードを見てください:

#!/ bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

if [$#-lt 2] || [$#-gt 2]
次に
エコー "用法:rssget.sh [all | description | title] [aboutdotcom | lxer]";
出口;
fi

case $ 1 in
すべて)
display = " - d -l -u"
;;
説明)
display = " - d -u"
;;
タイトル)
display = " - u"
;;
エッサック

ケース$ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
エッサック
rsstail $ display $ url;

変数は、変数に名前を付けて値を代入することによって定義されます。 上記の例では、変数の代入は次のとおりです。

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

スクリプトは、変数を使用することにより、即座に管理しやすくなります。 たとえば、各パラメータは個別に処理されるため、ネストされたIF文は存在しません。

all、descriptionまたはtitleを選択したかどうかによって表示変数が設定され、aboutdotcom変数またはlxer変数のいずれかを選択したかどうかによってurl変数はaboutdotcom変数の値またはlxer変数の値に設定されます。

rsstailコマンドはdisplayとurlの値を使って正しく動作させるだけです。

変数に名前を付けるだけで変数が設定されますが、変数を実際に使用するには変数の前に$記号を付ける必要があります。 言い換えれば、variable = valueは変数を値に設定しますが、$ variableは私に変数の内容を渡すことを意味します。

このチュートリアルの最後のスクリプトは次のとおりです。

#!/ bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "usage:rssget.sh [all | description | title] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
display = ""
url = ""

if [$#-lt 2] || [$#-gt 2]
次に
echo $ usage;
出口;
fi

case $ 1 in
すべて)
display = " - d -l -u"
;;
説明)
display = " - d -u"
;;
タイトル)
display = " - u"
;;
*)
echo $ usage;
出口;
;;
エッサック

ケース$ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ usage;
出口;
エッサック

rsstail $ display $ url;

上記のスクリプトは、より多くのRSSフィードを紹介し、2つの変数を入力しないか、変数に誤ったオプションを入力した場合に、スクリプトの使用方法をユーザーに伝える使用変数があります。

概要

これは叙事詩的な記事であり、あまりにも早すぎるかもしれません。 次のガイドでは、IFステートメントのすべての比較オプションを示しますが、変数に関してはまだまだ話があります。

また、上記のスクリプトを改善するためにもっと多くのことができます。これについては、ループ、 grep 、および正規表現を調べる際の将来のガイドで説明します。

l inux.about.comのHow To(記事のリストを見るためにカテゴリをスクロールダウン)セクションをチェックして、 WindowsとUbuntuのデュアルブートからGNOMEボックスを使って仮想マシンを設定するまでの、より有用なガイドを見つけてください。