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框设置虚拟机