Skip to main content

Bash的初学者指南 - 条件和变量

从零开始学学生信之Python-Part1 (可能 2025)

从零开始学学生信之Python-Part1 (可能 2025)
Anonim

介绍

欢迎阅读“BASH初学者指南”的第三部分。如果您错过了前两篇文章,那么您可能想知道是什么使本指南与其他BASH脚本指南不同。

本指南由一位完整的新手写给BASH,所以作为一个读者,你学习我学习。虽然我是BASH的新手,但我确实来自软件开发背景,尽管我编写的大部分内容都是针对Windows平台的。

您可以访问前两个指南:

  • BASH初学者指南 - Hello World
  • BASH初学者指南 - 输入参数

如果您不熟悉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”匹配之间的行 然后 和 科幻 跑了。

上面的脚本显然有缺陷。如果您根本不提供输入参数会发生什么?答案是你会遇到意外操作员的错误。

另一个主要缺陷是,如果你不提供“详细”这个词,那么根本没有任何事情发生。理想情况下,如果您不提供单词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行,并介绍了 其他 声明。基本上脚本现在说如果第一个参数是单词“verbose”获取RSS提要的描述,链接和标题,但如果第一个参数是其他任何东西,只需获取标题列表。

该脚本略有改进,但仍有缺陷。如果您输入参数失败,您仍会收到错误消息。即使你确实提供了一个参数,只是说你不想要详细并不意味着你只想要标题。例如,你可能只是拼写了冗长的错误,或者你可能输入了当然没有意义的鸽子。

在我们尝试清除这些问题之前,我想向您展示一个与IF语句相关的命令。

编辑rssget.sh脚本,如下所示:

#!/斌/庆典

如果$ 1 =“全部”然后 rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 =“描述”然后 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 all 然后你会得到描述,链接和标题。相反,如果你只是运行 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 =“描述” 然后 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 =“描述” 然后 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 all aboutdotcom

要么

sh rssget.sh所有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 =“全部” || $ 1 =“描述” || $ 1 =“标题” 然后 如果$ 2 =“aboutdotcom” 然后 如果$ 1 =“全部” 然后 rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 =“描述” 然后 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 =“描述” 然后 rsstail -d -u http://lxer.com/module/newswire/headlines.rss 其他 rsstail -u http://z.about.com/6/o/m/linux_p2.xml; 科幻 科幻 科幻科幻

首先要注意的是,脚本现在变得相当大,您可以快速查看嵌套IF语句的失控情况。

此脚本中重要的位是IF语句||声明那么第2行和第4行的部分。

||代表OR。所以行如果$ 2 =“aboutdotcom” || $ 2 =“lxer”检查第二个参数是否等于“aboutdotcom”或“lxer”。如果不是,则IF语句完成,因为没有 其他 最外层的声明 如果。

同样在第4行线上 如果$ 1 =“全部” || $ 1 =“描述” || $ 1 =“标题”检查第一个参数是否等于“全部”或“描述”或“标题”。

现在,如果用户运行sh rssget.sh土豆奶酪没有任何回报,而在他们收到LXER的标题列表之前。

与||相反是&&。 &&运算符代表AND。

我将使脚本看起来更像是一场噩梦,但它会进行所有重要的检查,以确保用户提供了2个参数。

#!/斌/庆典

如果$#-eq 2然后

如果$ 2 =“aboutdotcom” || $ 2 =“lxer” 然后 如果$ 1 =“全部” || $ 1 =“描述” || $ 1 =“标题” 然后 如果$ 2 =“aboutdotcom” 然后 如果$ 1 =“全部” 然后 rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 =“描述” 然后 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 =“描述” 然后 rsstail -d -u http://lxer.com/module/newswire/headlines.rss 其他 rsstail -u http://z.about.com/6/o/m/linux_p2.xml; 科幻 科幻 科幻 科幻科幻

该脚本中唯一的额外位是另一个外部IF语句,如下所示:如果$#-eq 2。如果您阅读有关输入参数的文章,您将知道$#返回输入参数数量的计数。 -eq代表等于。因此,IF语句检查用户输入了2个参数,如果没有,则只退出而不做任何事情。 (不是特别友好)。

我知道这个教程变得非常大。本周没有更多的报道,但我想在完成之前帮助整理脚本。

您需要了解条件语句的最后一个命令是CASE语句。

#!/斌/庆典

如果$#-eq 2然后 案件$ 2 in 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科幻

案例陈述是一种更好的写入IF ELSE的方式,如果是的话。

例如这个逻辑

如果水果=香蕉那么这个如果水果=橙子那么这个如果水果=葡萄那么这个万一

可以改写为:

案例水果 香蕉) 做这个 ;; 橙子) 做这个 ;; 葡萄) 做这个 ;;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然后 echo“usage:rssget.sh all | description | title aboutdotcom | lxer”; 出口;科幻

案例1美元 所有) display =“ - d -l -u” ;; 描述) display =“ - d -u” ;; 标题) 显示= “ - u” 的 ;;ESAC

案件$ 2 in aboutdotcom) URL = $ aboutdotcom; ;; lxer) URL = $ lxer; ;;ESACrsstail $ display $ url;

通过给它命名然后为其赋值来定义变量。在上面的例子中,以下是变量赋值:

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

通过使用变量,脚本可以立即更易于管理。例如,每个参数都是单独处理的,因此没有嵌套的IF语句。

现在设置显示变量取决于您是选择全部,描述还是标题,并且url变量设置为aboutdotcom变量的值或lxer变量的值,具体取决于您是选择aboutdotcom还是lxer。

rsstail命令现在只需要使用display和url的值来正确运行。

虽然变量只是通过给它们命名来设置,但实际使用它们时你必须在它们前面放置一个$符号。换句话说,variable = value将变量设置为值,而$ variable表示给出变量的内容。

以下是本教程的最终脚本。

#!/斌/庆典

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 $用法; 出口;科幻

案例1美元 所有) display =“ - d -l -u” ;; 描述) display =“ - d -u” ;; 标题) 显示= “ - u” 的 ;; *) echo $用法; 出口; ;;ESAC

案件$ 2 in aboutdotcom) URL = $ aboutdotcom; ;; lxer) URL = $ lxer; ;; linuxtoday) URL = $ linuxtoday; ;; everydaylinuxuser) URL = $ everydaylinuxuser; ;; *) echo $用法; 出口;ESAC

rsstail $ display $ url;

上面的脚本引入了更多的RSS提要,并且有一个用法变量,告诉用户如果他们要么不输入2个变量,要么输入错误的变量选项,如何使用脚本。

摘要

这是一篇史诗般的文章,可能太早了。在下一个指南中,我将向您展示IF语句的所有比较选项,还有更多关于变量的讨论。

还可以采取更多措施来改进上述脚本,这将在未来的指南中介绍,因为我们将探索循环,grep和正则表达式。

查看linux.about.com的“如何(向下滚动浏览类别以查看文章列表”部分)以查找从双启动Windows和Ubuntu到使用GNOME框设置虚拟机的更多有用指南。