bash新手指南-条件和变量

学习如何在BASH中处理信息和做出决策

欢迎来到“BASH初学者指南”的第三部分。本指南将重点介绍如何使用条件语句测试用户输入和控制脚本如何运行。

如果您是BASH新手,或者想查看前两个指南,请访问BASH初学者指南- Hello WorldBASH初学者指南-输入参数

安装rsstail

要遵循本指南,您需要安装名为rsstail的命令行应用程序,用于读取RSS提要

如果你用的是Debian/Ubuntu/薄荷基于的分布,输入以下内容:

安装rsstail

为了Fedora./CentOS等,输入以下内容:

dnf安装rsstail

为了opensuse.,输入以下内容:

zypper安装rsstail.

IF语句

打开一个终端并通过键入以下内容创建一个名为rssget.sh的文件:

sudo nano rssget.sh

在nano编辑器中,输入以下文本:

# !/bin/bash
rsstail -u https://www.espn.com/espnn/rss/news;

按下保存文件Ctrl.O.然后按下退出Ctrl.X

确保脚本是可执行的。

chmod + x rssget.sh

输入以下内容运行脚本:

sh rssget.sh

该脚本将返回来自ESPN RSS提要的标题列表。

这不是一个过于有用的脚本,因为它只是从一个RSS源中检索标题,但它确实可以保存必须记住ESPN RSS源的路径。

再次在nano中打开rssget.sh脚本,并编辑文件,如下所示:

# !/bin/bash
如果[$1 = "verbose"]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
fi

再次运行脚本,输入以下内容:

sh rssget.sh verbose.

这一次,返回了带有标题、链接和描述的RSS提要。

分析脚本

让我们来分析一下这个脚本的细节:

# !/bin/bash在我们写的每个脚本中出现。下一行基本上看着用户提供的第一个输入参数,并将其与“冗长”一词进行比较。如果输入参数和单词“冗长”匹配,则之间的线然后fi经营。

上面的脚本显然有缺陷。如果根本不提供输入参数会发生什么?答案是你会得到一个意外的运算符的错误。

另一个主要缺陷是,如果不提供“冗长”这个词,那么什么也不会发生。理想情况下,如果不提供单词verbose,脚本将返回一个标题列表。

再次使用nano编辑rssget.sh文件,修改如下代码:

# !/bin/bash
如果[$1 = "verbose"]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/news;
fi

保存文件并通过键入以下内容来运行它:

sh rssget.sh verbose.

将显示标题、描述和链接的列表。现在,再运行一次,如下所示:

sh rssget.sh标题

这一次只出现一个标题列表。

脚本的额外部分在第4行,介绍了其他的声明。基本上,该脚本现在表示,如果第一个参数是单词“verbose”,则获取RSS提要的描述、链接和标题,但如果第一个参数是其他任何内容,则获取标题列表。

该脚本略有改善,但仍然有缺陷。如果未进入参数,则仍会收到错误。即使您确实提供了一个参数,只是说你不想要verbose并不意味着你只想要标题。例如,您可能刚刚拼写冗长的错误,或者您可能有类型的鸽子,当然是毫无意义的。

elif命令

在尝试清除这些问题之前,您应该看到与IF语句配套的另一个命令。

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

# !/bin/bash
如果[$1 = "all"]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
if [$1 = "description"]
然后
Rsstail -d -u https://www.espn.com/espn/rss/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/news;
fi

在这个例子中,verbose被替换为“all”。它更简单,这不是重要的部分。上面的脚本介绍了el,这是一个简短的方式,即如果是。

现在,脚本如下所示。如果你运行sh rssget.sh所有,然后得到描述、链接和标题。如果,你只是跑SH.rssget.sh描述您只会得到标题和描述。如果您提供任何其他单词,您将得到一个标题列表。

嵌套的if语句

这引入了一种快速生成条件语句列表的方法。另一种方法el是用什么叫做嵌套如果语句。

下面是一个演示如何嵌套的示例如果报表工作:

# !/bin/bash
如果[$1 = "baseball"]
然后
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
Elif [$2 = "description"]
然后
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/mlb/news;
fi
其他的
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
Elif [$2 = "description"]
然后
Rsstail -d -u https://www.espn.com/espn/rss/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/news;
fi
fi

如果愿意,可以随意键入所有这些,或者将其复制并粘贴到rssget.sh文件中。

上面的脚本引入了第二个参数,允许您选择RSS提要中的棒球标题或所有标题。

要运行它,输入以下内容:

sh rssget.sh棒球全部

sh rssget.sh全部全部

当然,您可以用描述或标题替换所有描述,以提供描述或仅限标题。

基本上,上面的代码说明了如果第一个参数是“baseball”,那么查看第二个if语句,该语句与前面的脚本相同。如果第一个参数是其他参数,则显示来自ESPN的一般标题。在这两种情况下,它都将再次查看内部if语句,以决定是否显示标题、描述或其他内容。

该脚本纯粹是作为一个嵌套IF语句的示例提供的,该脚本有很多错误,需要另一篇文章来解释它们。主要的问题是它是不可伸缩的。

设想您想要添加来自不同站点的另一个RSS提要,甚至是同一个站点上的不同运动?脚本会变得非常大,如果您决定更改内部if语句,则必须在多个地方更改它。

虽然存在嵌套的时间和地点,但它们应该谨慎使用。通常有一种方法重构你的代码这样你就不需要嵌套的话。我将在未来的文章中来到这个主题。

修复参数问题

现在让我们看看如何修复人们输入duff参数的问题。例如,在上面的脚本中,如果用户输入的第一个参数不是“baseball”,那么一般标题提要中就会出现文章列表,而不管输入的是什么。

此外,如果用户未输入“全部”或“描述”作为第二参数,则默认值是可能与用户想要的标题列表。

查看以下脚本(或将其复制并粘贴到您的RSSget.sh文件中。

# !/bin/bash
如果[$1 = "标题"]||[$1 = "棒球"]
然后
如果[2美元= " " ] || [ $ 2 = "描述 " ] || [ $ 2 = "标题"]
然后
如果[$ 1 =“头条新闻”]
然后
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
Elif [$2 = "description"]
然后
Rsstail -d -u https://www.espn.com/espn/rss/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/news;
fi
其他的
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
Elif [$2 = "description"]
然后
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/mlb/news;
fi
fi
fi
fi


首先要注意的是,脚本现在变得相当大,您可以很快看到嵌套IF语句会变得多么失控。

在此脚本中重要的位是if语句||然后在第2行和第4行的部分。

||代表OR。因此,线如果[$1 = "标题"]||[$1 = "棒球"]检查第二个参数是否等于“headline”或“baseball”。如果不是,则If语句是完整的,因为没有其他的最外层的表达式如果。

同样在第4行这条线上如果[2美元= " " ] || [ $ 2 = "描述 " ] || [ $ 2 = "标题"]检查第1个参数是否等于“all”或“description”或“title”。

现在如果用户运行sh rssget.sh土豆奶酪不会返回任何内容,而在此之前,它们会收到一个标题列表。

||的反义词是&&。&&运算符代表AND。

下一个示例将使脚本看起来更像一个噩梦,但它进行了最重要的检查,以确保用户提供了2个参数。

# !/bin/bash
如果[$#-eq 2]
然后
如果[$1 = "标题"]||[$1 = "棒球"]
然后
如果[2美元= " " ] || [ $ 2 = "描述 " ] || [ $ 2 = "标题"]
然后
如果[$ 1 =“头条新闻”]
然后
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/news;
elif [$ 3 =“描述”]
然后
Rsstail -d -u https://www.espn.com/espn/rss/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/news;
fi
其他的
如果[$ 2 =“全部”]
然后
Rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
Elif [$2 = "description"]
然后
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
其他的
rsstail -u https://www.espn.com/espnn/rss/mlb/news;
fi
fi
fi
fi
fi


该脚本中唯一额外的是另一个外部IF语句,如下所示:如果[$#-eq 2]。如果您阅读了关于输入参数的文章,您就会知道$#返回输入参数数量的计数。这情商代表=。

因此,IF语句检查用户是否输入了两个参数,如果没有输入,则退出而不做任何事情。(不是特别友好)。

显然,本教程的内容越来越多。这里没有更多内容要介绍,但是您可以学习如何在我们完成之前帮助整理脚本。

CASE语句的

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

# !/bin/bash

如果[$#-eq 2]
然后
案例2美元
标题)
案例1美元
全部)
Rsstail -d -l -u https://www.espn.com/espn/rss/news
;;
描述)
rsstail -d -u https://www.espn.com/espn/rss/news
;;
标题)
rsstail - u https://www.espn.com/espn/rss/news
;;
esac
;;
棒球)
案例1美元
全部)
Rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news
;;
描述)
Rsstail -d -u https://www.espn.com/espn/rss/mlb/news
;;
标题)
rsstail - u https://www.espn.com/espn/rss/mlb/news
;;
esac
;;
esac
fi

case语句是编写IF ELSE IF ELSE IF的一种更好的方式。

例如,这个逻辑

如果水果=香蕉
那么这一点
否则如果水果=橘子
那么这一点
否则如果水果=葡萄
那么这一点
万一

可以改写为:

案例结果是
香蕉)
做这个
;;
橘子)
做这个
;;
葡萄)
做这个
;;
esac

基本上,案例之后的第一个项目是你要比较的东西(例如,水果)。然后括号前面的每一项就是你要比较的东西,如果它与前面的行相匹配;;会跑。case语句以反向的esac(即反向case)结束。

在RSSget.sh脚本中,案例语句删除了一些可怕的嵌套,虽然没有真正提高它。

变量

要真正改进脚本,我需要向您介绍变量。

看看下面的代码:

# !/bin/bash
棒球=“https://www.espn.com/espn/rss/mlb/news”
标题= " https://www.espn.com/espn/rss/news "
显示=“”
url = " "
如果[$#-lt 2] ||[$#-gt 2]
然后
Echo "用法:rssget.sh [all|description|title] [headlines|baseball]";
退出;
fi
案例1美元
全部)
显示= " - d - l - u "
;;
描述)
显示= " - d - u "
;;
标题)
显示=“ - u”
;;
esac
案例2美元
标题)
URL = $头条新闻;
;;
棒球)
url = $ baselball;
;;
esac
rsstail $ display $ url;

通过给出一个名称,然后为其分配值来定义一个变量。在上面的示例中,以下是变量分配:

棒球=“https://www.espn.com/espn/rss/mlb/news”
标题= " https://www.espn.com/espn/rss/news "
显示=“”
url = " "

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

显示变量现在根据您选择的是all、description还是title设置,URL变量设置为头条新闻变量或值的值棒球变量,取决于您是否选择头条新闻棒球

rsstail命令现在只需使用显示的值和URL正确地运行。

虽然通过给出了一个名称来设置变量,但实际使用它们,你必须放置一个$在他们前面签名。换句话说,变量=值将变量设置为值,而$变量意思是“给我变量的内容”

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

# !/bin/bash
棒球=“https://www.espn.com/espn/rss/mlb/news”
标题= " https://www.espn.com/espn/rss/news "
足球= " https://www.espn.com/espn/rss/nfl/news "
篮球=“https://www.espn.com/espn/rss/nba/news”
用法=“用法:rssget.sh [全部|描述|描述|标题] [棒球|头条新闻|足球|篮球]”
显示=“”
url = " "
如果[$#-lt 2] ||[$#-gt 2]
然后
echo $使用;
退出;
fi
案例1美元
全部)
显示= " - d - l - u "
;;
描述)
显示= " - d - u "
;;
标题)
显示=“ - u”
;;
*)
echo $使用;
退出;
;;
esac
案例2美元
标题)
URL = $头条新闻;
;;
棒球)
url = $棒球;
;;
足球)
URL = $足球;
;;
篮球)
url = $篮球;
;;
*)
echo $使用;
退出;
esac
rsstail $ display $ url;

上面的脚本介绍了更多RSS源,并且有一个使用变量,告诉用户如何使用脚本,如果它们要么不进入两个变量,或者它们为变量输入不正确的选项。

这个页面有用吗?