有关bash,希望运维人能知晓的十件事

Posted 达内云计算运维培训

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关bash,希望运维人能知晓的十件事相关的知识,希望对你有一定的参考价值。

Tip:云计算6月免费课程火热抢先中,点击文末“阅读原文”快速抢先!

推荐: 

有关bash,希望运维人能知晓的十件事

 

简介:

我想写一篇文章来介绍一些不太知名的bash功能,于我觉得bash是一种要经常使用(且需理解)的技术,虽然许多人并不熟悉bash,但我觉得他们也认为非常重要便足够令人欣喜。


1、^x^y^


我总在使用的一个小技巧。

从来没有输入过类似的命令?

有关bash,希望运维人能知晓的十件事


哎,这个命令敲错了,所以你要敲“↑”,然后敲”←“直到”p“,然后输入”e"再执行。

或者这样输入:

有关bash,希望运维人能知晓的十件事

你可能需要注意的一个细节是:

有关bash,希望运维人能知晓的十件事


如果你想搜索“rep”,那你就要深入研究man page,学会使用这个更强大的命令:

有关bash,希望运维人能知晓的十件事


我不会在这里解释这个用法。。。


2、pushd/popd


这个在脚本中非常好用,特别是在循环中

如下所示,假设你正在写一个进入退出文件夹的for循环:

有关bash,希望运维人能知晓的十件事


你可以像这样使用pushd栈来重写上方代码:

有关bash,希望运维人能知晓的十件事


它可以追踪记录你切换的目录并进行入栈或出栈。


注意,当使用pushd出现错误时,可能会丢失栈的记录并且popd多次。因此你可能会想要在脚本中使用set -e,当然也可以用cd -,但是它不会使用栈——仅仅返回前一个目录

有关bash,希望运维人能知晓的十件事


3、shopt vs set


这两个命令困扰了我一阵子。

两者之间有什么不同呢?

set在之前的文章已经介绍过了,而shopt看起来与之相似。只输入shopt会显示一系列选项:

有关bash,希望运维人能知晓的十件事


我在这里(  here)找到了一些答案。

从根本上说,似乎有一系列的bash(和其他shells)建立在sh之上,而添加shopt命令则为设置额外的shell选项提供了一种方式

但是我也不确定……如果你知道为什么,请告诉我。


4、Here Docs 与 Here Strings


“Here Docs”是在shell中用一些语句创建的文件。

“诀窍”很简单。定义一个用于结束的单词,则在这个单词单独出现在一行之前的所有输入行将构成文件。

像这样:

有关bash,希望运维人能知晓的十件事


注意:

· 如果结束单词不是“单独”出现在一行中,那它可以构成文件

· SOMEENDSTRING通常是END,但这仅仅只是习惯

更鲜为人知的是“here string”:

有关bash,希望运维人能知晓的十件事


5、字符串变量的操作


以前你可能是像下面展示的那样写代码,用sed一类的工具来操作字符串:

有关bash,希望运维人能知晓的十件事


但是你可能不知道bash本身也是可以的。

这意味着你可以省去大量的sed和awk。

一种重写上述代码的方式如下所示:

有关bash,希望运维人能知晓的十件事


·#表示“从字符串开头开始匹配并删除所给的模式串”

·%表示“从字符串结尾开始匹配并删除所给的模式串”

在我的电脑上,后一种方法比前一种快两倍。并且(令我吃惊的是),他的速度跟类似功能的python脚本速度大致相当

如果你想使用通配符(见前文)模式串并采用贪婪模式,你需要双写:

有关bash,希望运维人能知晓的十件事


6、变量的默认值


这些对写脚本来说非常好用。

如果你有一个没有赋值的变量,你可以像这样给它“赋默认值”

创建一个default.sh文件,写入如下内容:

有关bash,希望运维人能知晓的十件事


现在执行chmod +x default.sh并用./default.sh first second来运行脚本:

观察第三个参数的默认值是如何被分配的,而不是前两个。

你也可以直接用${VAR:=defaultval}(等号,不是破折号),但是注意这不适用于脚本或函数中的位置变量。尝试修改上面的脚本来看它是如何失败的。


7、Traps


当一个信号被送到脚本时,内建的trap可以用于“捕获”

下面是我用在自己的chepci脚本中的一个例子:

有关bash,希望运维人能知晓的十件事


任何使用TERM信号的CTRL-C,CTRL-或终止程序的操作将会首先调用cleanup

注意:

·trap的逻辑可能非常棘手(例如处理信号竞争条件)

·KILL信号不能以这种方式捕获

但是大多数情况下,我会把它用于类似上述的‘cleanup’中,来达成函数的目的。


8、Shell变量


了解可用的标准shell变量是非常值得的。这些是我最喜欢的。


RANDOM

不要依赖这个来加密堆栈,但你可以生成随机数字,例如在脚本中创建临时文件时:

有关bash,希望运维人能知晓的十件事


REPLY

不在需要给read一个变量名称

有关bash,希望运维人能知晓的十件事


LINENO 与 SECONDS

方便调试

有关bash,希望运维人能知晓的十件事

注意,即便使用;来隔开命令,上面的代码也要分两行。


TMOUT

可以用来超时读取,在一些脚本中真的很好用

有关bash,希望运维人能知晓的十件事


9、Extglobs


如果你真的沉迷bash不能自拔,那么你可能想要增强你的通配功能。你可以通过设置shell中的extglob选项。这是设置方法:

有关bash,希望运维人能知晓的十件事

现在来看看你是否能指出以下这些语句各自的功能:

有关bash,希望运维人能知晓的十件事

虽然它可能很有用,但是很难想象出一种你必须要用这种方式的情况。通常你会使用一些更适合相应任务的工具(像sed)或者直接放弃bash去使用一些像python那样的“合适的”编程语言。


10、关联数组


谈到移植到其他语言,一条重要的规则是,如果我需要用到数组,那么我会放弃bash,使用python(为此我甚至创建了一个Docker Container来运行一个专门的工具)

知道读到它我才知道,在bash中有关联数组

以下是演示:

有关bash,希望运维人能知晓的十件事


注意仅适用于bash4.x+版本

英文原文:https://zwischenzugs.com/2018/01/21/ten-more-things-i-wish-id-known-about-bash/  

译者:D  


云计算6月免费课程火热抢先中运维行业老司机带你飞 —— 技术干货、行业前景、高薪秘笈通通免费分享,点击文末“阅读原文”或长按下图中二维码即可报名免费课程!名额有限,速速来抢~~~~

有关bash,希望运维人能知晓的十件事

【好消息!】平安产险承保达内学员平安就业教育保障险,帮助达内学员解决就业的后顾之忧,只要你是达内学员,就可以在达内各中心参保,为你的高薪就业保驾护航。

内容推荐:



咨询联系达妹QQ:3535503962。

*声明:内容与图片均来源于网络(部分内容有修改),版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

- END -

每年10万人选择达内教育

选择的人多,自然是好培训

有关bash,希望运维人能知晓的十件事

长 按 二 维 码, 一 键 关 注


点击“阅读原文”抢报Linux云计算免费课程!

以上是关于有关bash,希望运维人能知晓的十件事的主要内容,如果未能解决你的问题,请参考以下文章

有关bash,我希望我能知晓的十件事

有关bash,我希望我能知晓的十件事

大学里的十件事十本书十部电影

Solaris:你好奇的十件事

关于 Token,你应该知道的十件事

惹毛程序员的十件事!需求变更居然不是排第一