介绍
欢迎阅读“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”匹配then和fi之间的连线, 则运行。
上面的脚本显然是有缺陷的。 如果你根本没有提供输入参数会发生什么? 答案是你会遇到意想不到的操作员的错误。
另一个主要缺陷是如果你没有提供“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框设置虚拟机 。