Skip to main content

初心者のためのバッシュガイド - 条件と変数

Supersection 1, More Comfortable (六月 2025)

Supersection 1, More Comfortable (六月 2025)
Anonim

前書き

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

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

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

  • BASH初心者ガイド - Hello World
  • 初心者ガイドBASH - 入力パラメータ

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 / bashrsstail -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"という単語が、 次に そして fi 実行されます。

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

もう一つの大きな欠点は、あなたが "冗長"という言葉を与えなければ、何も起こらないということです。理想的には、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.xmlfi

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

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.xmlfi

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

スクリプトは次のように動作します。あなたが走ったら sh rssget.sh all あなたは説明、リンク、タイトルを取得します。代わりにあなたがただ走ったら 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 fielse 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 fifi

気に入ったら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 fifi

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

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

|| ORを表す。だからラインif $ 2 = "aboutdotcom" || $ 2 = "lxer"2番目のパラメータが "aboutdotcom"か "lxer"かどうかをチェックします。そうでなければ、IF文は完了していません。 else 最も外側の声明 IF。

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

ユーザーが実行している場合sh rssget.shジャガイモチーズ彼らは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 fifi

そのスクリプトで余分な唯一のビットは、次のような別の外部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、および正規表現を調べる際の将来のガイドで説明します。

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