BASH初學者指南 - 條件和變量

介紹

歡迎閱讀“BASH入門指南”的第三部分。 如果您錯過了前兩篇文章,那麼您可能會想知道本指南與其他BASH腳本指南的不同之處。

本指南由一位完全新手寫給BASH,以及您在學習時學習的讀者。 儘管我是BASH的新手,但我確實來自軟件開發背景,儘管我編寫的大部分內容都是針對Windows平台的。

您可以通過訪問查看前兩個指南:

如果您是BASH腳本新手,我建議您在繼續閱讀前兩本指南之前閱讀這本指南。

在本指南中,我將強調如何使用條件語句來測試用戶輸入並控制腳本的工作方式。

安裝rsstail

為了遵循本指南,您需要安裝名為rsstail的命令行應用程序,該應用程序用於讀取RSS提要

如果您使用基於Debian / Ubuntu / Mint的分發,請鍵入以下內容:

sudo apt-get install rsstail

對於Fedora / CentOS等,輸入以下內容:

yum安裝rsstail

對於openSUSE輸入以下內容:

zypper安裝rsstail

IF聲明

打開一個終端並通過輸入以下內容創建一個名為rssget.sh的文件:

sudo nano rssget.sh

在nano編輯器中輸入以下文本:

#!/斌/慶典
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

按CTRL和O保存文件,然後按CTRL和X退出。

輸入以下內容運行腳本:

sh rssget.sh

該腳本將返回來自linux.about.com RSS源的標題列表。

它不是一個非常有用的腳本,因為它只是從一個RSS提要中檢索標題,但它不必記住Linux.about.com RSS提要的路徑。

再次打開nano中的rssget.sh腳本並編輯該文件,如下所示:

#!/斌/慶典

如果[$ 1 =“詳細”]
然後
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
科幻

輸入以下內容再次運行該腳本:

sh rssget.sh詳細

這一次RSS提要帶有標題,鏈接和描述。

我們來分析一下腳本的細節:

#!/ bin / bash出現在我們編寫的每個腳本中。 下一行主要查看用戶提供的第一個輸入參數,並將其與“verbose”一詞進行比較。 如果輸入參數和單詞“verbose”匹配thenfi之間的連線, 運行。

上面的腳本顯然是有缺陷的。 如果你根本沒有提供輸入參數會發生什麼? 答案是你會遇到意想不到的操作員的錯誤。

另一個主要缺陷是如果你沒有提供“verbose”這個詞,那麼什麼都不會發生。 理想情況下,如果您不提供verbose這個詞,那麼腳本會返回一個標題列表。

再次使用nano來編輯rssget.sh文件並修改代碼,如下所示:

#!/斌/慶典

如果[$ 1 =“詳細”]
然後
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻

保存該文件並通過輸入以下內容運行它:

sh rssget.sh詳細

將出現標題,說明和鏈接列表。 現在再次運行它如下:

sh rssget.sh標題

這次僅顯示標題列表。

腳本的額外部分在第4行,並引入了else語句。 現在腳本現在說,如果第一個參數是“詳細”一詞,請獲取RSS源的描述,鏈接和標題,但如果第一個參數是其他內容,則只需獲取標題列表。

劇本略有改善,但仍然有缺陷。 如果您未能輸入參數,您仍會收到錯誤。 即使你確實提供了一個參數,只是說你不想要冗長並不意味著你只想要標題。 你可能剛剛拼寫了錯誤的例子,或者你可能輸入了一些當然沒有意義的鴿子。

在我們嘗試清除這些問題之前,我想向您展示一條IF語句的命令。

編輯你的rssget.sh腳本如下所示:

#!/斌/慶典

如果[$ 1 =“全部”]
然後
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;

其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻

我決定擺脫verbose這個詞,並將其全部替換掉。 這不是重要的部分。 上面的腳本介紹了elif ,這是一個說ELSE IF的簡短方法。

現在該腳本的工作如下。 如果你運行sh rssget.sh,那麼你會得到描述,鏈接和標題。 如果您只是運行sh rssget.sh描述,您將只獲得標題和描述。 如果你提供任何其他詞,你會得到一個標題列表。

這引入了一種快速提出條件語句列表的方法。 另一種做ELIF的方法是使用所謂的嵌套IF語句。

以下是顯示嵌套IF語句如何工作的示例:

#!/斌/慶典

如果[$ 2 =“aboutdotcom”]
然後
如果[$ 1 =“全部”]
然後
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;

其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
其他
如果[$ 1 =“全部”]
然後
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =“description”]
然後
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
科幻

隨意鍵入所有內容,如果你喜歡或複制並粘貼到你的rssget.sh文件。

上面的腳本引入了第二個參數,它可以讓您選擇“about.com”或“lxer.com”作為RSS源。

要運行它,請輸入以下內容:

sh rssget.sh所有aboutdotcom

要么

sh rssget.sh all lxer

你當然可以用描述或標題來替換所有的描述或標題。

基本上上面的代碼說,如果第二個參數是aboutdotcom,那麼查看第二個if語句,如果第二個參數是lxer,那麼再查看內部if語句,以決定是否顯示標題,說明或一切。

該腳本純粹作為嵌套的IF語句的示例提供,並且該腳本有太多的錯誤,所以需要另一篇文章來解釋它們。 主要問題是它不可擴展。

想像一下,你想添加另一個RSS源,例如Everyday Linux User或Linux Today? 該腳本將變得非常龐大,如果您決定要讓內部IF語句發生變化,您將不得不在多個地方進行更改。

儘管嵌套IF的時間和地點應該謹慎使用。 通常有一種方法可以重構代碼,以便根本不需要嵌套的IF。 我將在未來的文章中談到這個問題。

現在讓我們來看看如何解決人們輸入duff參數的問題。 例如,在上面的腳本中,如果用戶輸入的內容不是“aboutdotcom”作為第二個參數,則無論用戶是否輸入lxer,都會從LXER的RSS提要中顯示文章列表。

另外,如果用戶沒有輸入“全部”或“描述”作為第一個參數,那麼默認值是可能或不是用戶想要的標題列表。

看看下面的腳本(或複制並粘貼到你的rssget.sh文件中。

#!/斌/慶典

如果[$ 2 =“aboutdotcom”] || [$ 2 =“lxer”]
然後
如果[$ 1 =“all”] || [$ 1 =“description”] || [$ 1 =“title”]
然後
如果[$ 2 =“aboutdotcom”]
然後

如果[$ 1 =“全部”]
然後
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;

其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
其他
如果[$ 1 =“全部”]
然後
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =“description”]
然後
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
科幻
科幻
科幻

首先要注意的是,腳本現在變得相當大,你可以很快看到失控嵌套的IF語句可以變得如何。

這個腳本中重要的位是IF語句|| 聲明THEN部分在第2行和第4行。

|| 代表OR。 所以如果[$ 2 =“aboutdotcom”] ||這一行 [$ 2 =“lxer”]檢查第二個參數是否等於“aboutdotcom”或“lxer”。 如果不是那麼IF語句就完成了,因為最外層IF沒有else語句

同樣在第4行, if [$ 1 =“all”] || [$ 1 =“description”] || [$ 1 =“title”]檢查第一個參數是否等於“all”或“description”或“title”。

現在,如果用戶運行sh rssget.sh土豆芝士,沒有任何東西會返回,而在他們收到LXER的標題列表之前。

與||相反 是&&。 &&運算符代表AND。

我打算讓腳本看起來更像是一場噩夢,但它會使所有重要的檢查確保用戶提供了2個參數。

#!/斌/慶典

如果[$#-eq 2]
然後

如果[$ 2 =“aboutdotcom”] || [$ 2 =“lxer”]
然後
如果[$ 1 =“all”] || [$ 1 =“description”] || [$ 1 =“title”]
然後
如果[$ 2 =“aboutdotcom”]
然後

如果[$ 1 =“全部”]
然後
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;

其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
其他
如果[$ 1 =“全部”]
然後
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =“description”]
然後
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
其他
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
科幻
科幻
科幻
科幻
科幻

該腳本中唯一額外的位是另一個外部IF語句,如下所示: if [$#-eq 2] 。 如果您閱讀關於輸入參數的文章,您將知道$#返回輸入參數數量的計數。 -eq代表等於。 IF語句因此檢查用戶是否輸入了2個參數,如果它們不是,它只是退出而不做任何事情。 (並不特別友好)。

我知道這個教程變得相當大。 本週沒有太多的報導,但我希望在完成之前幫助整理劇本。

您需要了解有關條件語句的最後一條命令是CASE語句。

#!/斌/慶典


如果[$#-eq 2]
然後
案件2美元
aboutdotcom)
案件1美元
所有)
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
;;
ESAC
;;
lxer)
案件1美元
所有)
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
;;
ESAC
;;
ESAC
科幻

case語句是編寫IF ELSE IF如果ELSE IF的更好方法。

例如這個邏輯

如果水果=香蕉
那麼這個
否則,如果水果=橘子
那麼這個
否則如果水果=葡萄
那麼這個
萬一

可以改寫為:

盒裝水果
香蕉)
做這個
;;
橙子)
做這個
;;
葡萄)
做這個
;;
ESAC

基本上,案件之後的第一個項目是你要比較的東西(即水果)。 然後括號前面的每個項目就是你比較的東西,並且它與前面的行相符;; 將會跑。 case語句以反向esac結尾(情況反向)。

在rssget.sh腳本中,case語句刪除了一些可怕的嵌套,儘管沒有真正改善它。

為了真正改善腳本,我需要向你介紹變量。

看下面的代碼:

#!/斌/慶典

lxer =“lxer.com/module/newswire/headlines.rss”
aboutdotcom =“z.about.com/6/o/m/linux_p2.xml”
顯示=“”
URL =“”

如果[$#-lt 2] || [$#-gt 2]
然後
迴聲“用法:rssget.sh [all | description | title] [aboutdotcom | lxer]”;
出口;
科幻

案件1美元
所有)
display =“ - d -l -u”
;;
描述)
display =“ - d -u”
;;
標題)
顯示=“ - u”的
;;
ESAC

案件2美元
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
ESAC
rsstail $ display $ url;

通過給它一個名字然後給它賦值來定義一個變量。 在上面的例子中,以下是變量賦值:

lxer =“lxer.com/module/newswire/headlines.rss”
aboutdotcom =“z.about.com/6/o/m/linux_p2.xml”
顯示=“”
URL =“”

通過使用變量,腳本立即更易於管理。 例如,每個參數都是分開處理的,所以沒有嵌套的IF語句。

顯示變量現在根據您是否選擇all,description或title來設置,並且url變量設置為aboutdotcom變量的值或lxer變量的值,具體取決於您是選擇aboutdotcom還是lxer。

rsstail命令現在只需使用display和url的值來正確運行。

雖然變量只是通過給他們一個名字來設置的,但要真正使用它們,您必須在它們前面放置一個$符號。 換句話說,變量=值將變量設置為一個值,而$變量意味著給我變量的內容。

以下是本教程的最終腳本。

#!/斌/慶典

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]”
顯示=“”
URL =“”

如果[$#-lt 2] || [$#-gt 2]
然後
echo $ usage;
出口;
科幻

案件1美元
所有)
display =“ - d -l -u”
;;
描述)
display =“ - d -u”
;;
標題)
顯示=“ - u”的
;;
*)
echo $ usage;
出口;
;;
ESAC

案件2美元
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
linuxtoday)
URL = $ linuxtoday;
;;
everydaylinuxuser)
URL = $ everydaylinuxuser;
;;
*)
echo $ usage;
出口;
ESAC

rsstail $ display $ url;

上面的腳本引入了更多的RSS提要,並且有一個用法變量,告訴用戶如果不輸入2個變量或者為變量輸入錯誤的選項,如何使用腳本。

概要

這是一篇史詩般的文章,可能已經太早了。 在下一個指南中,我將向您展示IF語句的所有比較選項,並且還有很多要討論的變量。

還有更多可以完成上述腳本的工作,這將在我們探索循環, grep和正則表達式的未來指南中進行介紹。

查看l inux.about.com上的How To(向下滾動查看類別以查看文章列表)部分,從雙引導Windows和Ubuntu中找到更多有用的指南,以便使用GNOME框設置虛擬機