怎样用 Bash 编程:语法和工具
让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇。-- David Both(作者)
Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会 显示在你的终端 。所有我熟悉的 shell 同时也是一门编程语言。
(相关资料图)
Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 Emacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。
然而,如果你把 Bash 当作单纯的 shell 来用,则无法体验它的真实能力。我在设计一套包含三卷的 Linux 自学课程 时(这个系列的文章正是基于此课程),了解到许多 Bash 的知识,这些是我在过去 20 年的 Linux 工作经验中所没有掌握的,其中的一些知识就是关于 Bash 的编程用法。不得不说,Bash 是一门强大的编程语言,是一个能够同时用于命令行和 shell 脚本的完美设计。
本系列文章将要探讨如何使用 Bash 作为命令行界面(CLI)编程语言。第一篇文章简单介绍 Bash 命令行编程、变量以及控制运算符。其他文章会讨论诸如:Bash 文件的类型;字符串、数字和一些逻辑运算符,它们能够提供代码执行流程中的逻辑控制;不同类型的 shell 扩展;通过 for、while 和 until 来控制循环操作。
Shell
Bash 是 Bourne Again Shell 的缩写,因为 Bash shell 是 基于 更早的 Bourne shell,后者是 Steven Bourne 在 1977 年开发的。另外还有很多 其他的 shell 可以使用,但下面四个是我经常见到的:
csh:C shell 适合那些习惯了 C 语言语法的开发者。ksh:Korn shell,由 David Korn 开发,在 Unix 用户中更流行。tcsh:一个 csh 的变种,增加了一些易用性。zsh:Z shell,集成了许多其他流行 shell 的特性。所有 shell 都有内置命令,用以补充或替代核心工具集。打开 shell 的 man 说明页,找到“BUILT-INS”那一段,可以查看都有哪些内置命令。
每种 shell 都有它自己的特性和语法风格。我用过 csh、ksh 和 zsh,但我还是更喜欢 Bash。你可以多试几个,寻找更适合你的 shell,尽管这可能需要花些功夫。但幸运的是,切换不同 shell 很简单。
所有这些 shell 既是编程语言又是命令解释器。下面我们来快速浏览一下 Bash 中集成的编程结构和工具。
做为编程语言的 Bash
大多数场景下,系统管理员都会使用 Bash 来发送简单明了的命令。但 Bash 不仅可以输入单条命令,很多系统管理员可以编写简单的命令行程序来执行一系列任务,这些程序可以作为通用工具,能节省时间和精力。
编写 CLI 程序的目的是要提高效率(做一个“懒惰的”系统管理员)。在 CLI 程序中,你可以用特定顺序列出若干命令,逐条执行。这样你就不用盯着显示屏,等待一条命令执行完,再输入另一条,省下来的时间就可以去做其他事情了。
什么是“程序”?
自由在线计算机词典( FOLDOC )对于程序的定义是:“由计算机执行的指令,而不是运行它们的物理硬件。”普林斯顿大学的 WordNet 将程序定义为:“……计算机可以理解并执行的一系列指令……” 维基百科 上也有一条不错的关于计算机程序的条目。
总结下,程序由一条或多条指令组成,目的是完成一个具体的相关任务。对于系统管理员而言,一段程序通常由一系列的 shell 命令构成。Linux 下所有的 shell (至少我所熟知的)都有基本的编程功能,Bash 作为大多数 linux 发行版的默认 shell,也不例外。
本系列用 Bash 举例(因为它无处不在),假如你使用一个不同的 shell 也没关系,尽管结构和语法有所不同,但编程思想是相通的。有些 shell 支持某种特性而其他 shell 则不支持,但它们都提供编程功能。Shell 程序可以被存在一个文件中被反复使用,或者在需要的时候才创建它们。
简单 CLI 程序
最简单的命令行程序只有一或两条语句,它们可能相关,也可能无关,在按回车键之前被输入到命令行。程序中的第二条语句(如果有的话)可能取决于第一条语句的操作,但也不是必须的。
这里需要特别讲解一个标点符号。当你在命令行输入一条命令,按下回车键的时候,其实在命令的末尾有一个隐含的分号(;)。当一段 CLI shell 程序在命令行中被串起来作为单行指令使用时,必须使用分号来终结每个语句并将其与下一条语句分开。但 CLI shell 程序中的最后一条语句可以使用显式或隐式的分号。
一些基本语法
下面的例子会阐明这一语法规则。这段程序由单条命令组成,还有一个显式的终止符:
看起来不像一个程序,但它确是我学习每个新编程语言时写下的第一个程序。不同语言可能语法不同,但输出结果是一样的。
让我们扩展一下这段微不足道却又无所不在的代码。你的结果可能与我的有所不同,因为我的家目录有点乱,而你可能是在 GUI 桌面中第一次登录账号。
现在是不是更明显了。结果是相关的,但是两条语句彼此独立。你可能注意到我喜欢在分号前后多输入一个空格,这样会让代码的可读性更好。让我们再运行一遍这段程序,这次不要带结尾的分号:
输出结果没有区别。
关于变量
像所有其他编程语言一样,Bash 支持变量。变量是个象征性的名字,它指向内存中的某个位置,那里存着对应的值。变量的值是可以改变的,所以它叫“变~量”。
Bash 不像 C 之类的语言,需要强制指定变量类型,比如:整型、浮点型或字符型。在 Bash 中,所有变量都是字符串。整数型的变量可以被用于整数运算,这是 Bash 唯一能够处理的数学类型。更复杂的运算则需要借助 bc 这样的命令,可以被用在命令行编程或者脚本中。
变量的值是被预先分配好的,这些值可以用在命令行编程或者脚本中。可以通过变量名字给其赋值,但是不能使用 $ 符开头。比如,VAR=10 这样会把 VAR 的值设为 10。要打印变量的值,你可以使用语句 echo $VAR。变量名必须以文本(即非数字)开始。
Bash 会保存已经定义好的变量,直到它们被取消掉。
下面这个例子,在变量被赋值前,它的值是空(null)。然后给它赋值并打印出来,检验一下。你可以在同一行 CLI 程序里完成它:
注意:变量赋值的语法非常严格,等号(=)两边不能有空格。
那个空行表明了 MyVar 的初始值为空。变量的赋值和改值方法都一样,这个例子展示了原始值和新的值。
正如之前说的,Bash 支持整数运算,当你想计算一个数组中的某个元素的位置,或者做些简单的算术运算,这还是挺有帮助的。然而,这种方法并不适合科学计算,或是某些需要小数运算的场景,比如财务统计。这些场景有其它更好的工具可以应对。
下面是个简单的算术题:
好像没啥问题,但如果运算结果是浮点数会发生什么呢?
结果会被取整。请注意运算被包含在 echo 语句之中,其实计算在 echo 命令结束前就已经完成了,原因是 Bash 的内部优先级。想要了解详情的话,可以在 Bash 的 man 页面中搜索 “precedence”。
控制运算符
Shell 的控制运算符是一种语法运算符,可以轻松地创建一些有趣的命令行程序。在命令行上按顺序将几个命令串在一起,就变成了最简单的 CLI 程序:
只要不出错,这些命令都能顺利执行。但假如出错了怎么办?你可以预设好应对出错的办法,这就要用到 Bash 内置的控制运算符, && 和 ||。这两种运算符提供了流程控制功能,使你能改变代码执行的顺序。分号也可以被看做是一种 Bash 运算符,预示着新一行的开始。
&& 运算符提供了如下简单逻辑,“如果 command1 执行成功,那么接着执行 command2。如果 command1 失败,就跳过 command2。”语法如下:
现在,让我们用命令来创建一个新的目录,如果成功的话,就把它切换为当前目录。确保你的家目录(~)是当前目录,先尝试在 /root 目录下创建,你应该没有权限:
上面的报错信息是由 mkdir 命令抛出的,因为创建目录失败了。&& 运算符收到了非零的返回码,所以 cd 命令就被跳过,前者阻止后者继续运行,因为创建目录失败了。这种控制流程可以阻止后面的错误累积,避免引发更严重的问题。是时候讲点更复杂的逻辑了。
当一段程序的返回码大于零时,使用 || 运算符可以让你在后面接着执行另一段程序。简单语法如下:
解读一下,“假如 command1 失败,执行 command2”。隐藏的逻辑是,如果 command1 成功,跳过 command2。下面实践一下,仍然是创建新目录:
正如预期,因为目录无法创建,第一条命令失败了,于是第二条命令被执行。
把 && 和 || 两种运算符结合起来才能发挥它们的最大功效。请看下面例子中的流程控制方法:
语法解释:“假如 command1 退出时返回码为零,就执行 command2,否则执行 command3。”用具体代码试试:
现在我们再试一次,用你的家目录替换 /root 目录,你将会有权限创建这个目录了:
像 command1 && command2 这样的控制语句能够运行的原因是,每条命令执行完毕时都会给 shell 发送一个返回码,用来表示它执行成功与否。默认情况下,返回码为 0 表示成功,其他任何正值表示失败。一些系统管理员使用的工具用值为 1 的返回码来表示失败,但其他很多程序使用别的数字来表示失败。
Bash 的内置变量 $? 可以显示上一条命令的返回码,可以在脚本或者命令行中非常方便地检查它。要查看返回码,让我们从运行一条简单的命令开始,返回码的结果总是上一条命令给出的。
在这个例子中,返回码为零,意味着命令执行成功了。现在对 root 的家目录测试一下,你应该没有权限:
本例中返回码是 2,表明非 root 用户没有权限进入这个目录。你可以利用这些返回码,用控制运算符来改变程序执行的顺序。
总结
本文将 Bash 看作一门编程语言,并从这个视角介绍了它的简单语法和基础工具。我们学习了如何将数据输出到 STDOUT,怎样使用变量和控制运算符。在本系列的下一篇文章中,将会重点介绍能够控制指令执行流程的逻辑运算符。
标签:
- 怎样用 Bash 编程:语法和工具
- 【天天时快讯】高兴的反义词有什么一年级下册(高兴的反义词)
- bl耽美小说txt下载_bl小说下载
- 人说山西好风光的歌词 环球新要闻
- 青岛海牛官方:河南嵩山龙门中场钟晋宝正式加盟球队
- 焦点快看:视频丨时隔三年,厦金航线今起实现双向对开
- 沅陵职中:开展春季消防及防踩踏应急疏散演练
- 阿伦艾弗森妻子|当前热门
- 当前滚动:张家港经开区(杨舍镇):党建引领“公益圈” ,为民服务“益”起来
- 宝马1系多少钱(宝马1系2021款落地需要多少钱?)
- 冯小刚又惹争议了,可65岁的他,已走上大导演的另一条路
- 百江燃气号码是多少
- 多省遭遇冰雹袭击,有地区冰雹大如鸡蛋!有人被砸伤、车窗被砸穿……|来听新闻
- 股票行情快报:全聚德(002186)3月24日主力资金净卖出273.70万元-全球今头条
- 每日热讯!美国3月Markit制造业PMI初值49.3
- 公安部交通管理局部署做好清明假期交通管理工作
- 文旅融合助力乡村振兴 环球今日讯
- 注意!广电网络将于4月10日召开股东大会
- 当前头条:A某是TOP前女友是怎么回事
- 环球观速讯丨马斯克想要在得州建乌托邦,遭不少居民反对:担忧废水排入河流
- 2023普通二本大学有哪些 国内二本院校名单【最新】
- 炼化低碳转型:减碳同创新需同步发展
- 肃北税务:“三抓三促”强落实 税惠春风促发展|全球资讯
- 大学向公众开放应是常态-环球新消息
- 全球看热讯:杂面条得做法
- 【世界快播报】伟星股份(002003):2023年3月22日投资者关系活动记录表
- 天风证券给予伯特利买入评级 2022年全年业绩符合预期 智能电控持续加速_环球新资讯
- 3月23日基金净值:招商核心价值混合最新净值1.6741,涨0.78% 每日热文
- 全球最资讯丨北京市颁出首张电商转实体营业执照
- 影刺怎么录制一秒18下_影刺z7_世界速看料
- 贵州大学怎么样|全球播报
- 每日关注!鹏鼎控股:单一大客户收入超五成,募投项目惹质疑
- 临沂高速交警支队深入推进“春季守护”行动
- 外汇技术顺口溜|天天热点
- 同花顺今日涨18.08%2家机构净买入2.29亿元 环球时讯
- 仙剑四琼华记(同人) 每日热点
- 省国资国企踊跃参加聚四方之才共建自贸港“百场万岗·四城同办” (第二场)西安站校招活动_热讯
- 1978年属什么
- 真如网友说的那般不堪,泰国旅游这碗饭早就不用吃了 环球看热讯
- MaxKey 单点登录认证系统 3.5.16 发布,开源 IAM 产品
- 羊羔毛外套暖和还是羽绒服暖和? 世界快播
- 在北京投放24万张卡将推出限卡抽奖政策
- 王者荣耀更新时间几点_全球新消息
- 肥宅快乐水是什么呀_肥宅快乐水是什么 当前视讯
- 换个角度看问题的名人素材-关于换个角度看问题的名人名言-天天热推荐
- 百事通!柳树菇的正确吃法_柳树菇
- 世界报道:肉包不吃肉微博(肉包不吃肉)
- 牛多多燃烧战车,燃烧战车哪去了 世界快看点
- 世界通讯!宣统三年大清银币价格(2023年03月22日)
- 来潮汕旅游不能错过的10种美食,你值得去吃|当前视点
- 新动态:谷歌CEO谈Bard:用户反馈很重要 已邀数万人员参与测试
- 新动态:港股午评:恒指涨近2% 地产股领涨
- 这个三月,致敬地产“她力量”——“选择成为物业工作者,我从未有过后悔的时刻!”-环球头条
- 湖南助力首批春季入伍退役军人“退役即就业”“上岗即上手” 当前速读
- 东莞农村商业银行手机银行客户端(东莞农村商业银行个人网上银行登录)
- 每日热讯!欧式沙发茶几电视柜餐桌_欧式沙发
- 定向就业招生是哪些意思_定向就业招生是啥意思 世界热推荐
- 今日热闻!根据新发现 苹果iPhone12可能会禁用植入式起搏器
- 每日视讯:3月22日南宁望仙坡社区卫生服务站开放九价hpv疫苗预约
- 全球速看:努比亚Z50 Ultra售罄后首次补货!全面屏观感十分惊艳
- 2023广州天河区积分入学有补充加分吗
- 天天热门:公募基金分红什么意思_基金分红什么意思
- 春季守护行动|车“黑”心也“黑”……
- 龙空网app最新版_龙空网-今日快讯
- “回笼漂”,也许是迫不得已的决定
- 天天微头条丨《一拳超人》第一季登顶峰,第二季却遭漫迷吐槽,而原因是这些内容
- 青海运动员牛卓玛英吉亚洲竞走锦标赛夺冠_天天即时
- 无锡清明节露营地点有哪些
- 世界通讯!镇沅彝族哈尼族拉祜族自治县气象台发布大风预警信号蓝色预警【Ⅳ级/一般】
- 领太原失业金对以后退休金有影响吗? 天天最资讯
- 荷多音字组词的读法
- 巴东县属于哪个省份_四川巴东县属于哪个市
- 当前滚动:老干妈官宣否认退网:天猫店铺正常营业,消费者可放心
- 豪婿韩三千大结局全文更新_豪婿韩三千大结局 要闻速递
- 每日热闻!虚拟传真机电话号码如何申请_虚拟传真
- 山伯伯四季果园
- 快消息!泉山教育转变作风奏响“四敢”最强音
- 关的部首怎么读_关的部首
- 孙侨潞去世前最后视频曝光 她经历了什么【图】_每日讯息
- oppor17手机解锁破解教程视频_oppor17解锁密码破解
- 陕西汉中春意浓 “最美油菜花海”灿烂盛放
- 挥动翅膀的女孩 焦点快报
- 女子网上投资创业遭遇骗局,警银协作跨越千里破案追赃
- 你物理常年分数低的原因在这!摸透做题效率直接翻倍!
- 金木研衣服是什么款_金木研衣服
- 3月17日基金净值:易方达新经济混合最新净值3.828,跌0.55% 环球观热点
- 全球今热点:lilybell_君影草
- 植绿造景 扮靓枣庄山亭店韩路|全球聚焦
- 每日信息:今晚!喜提下调!
- 时讯:离婚有一方不离怎么办?
- 生姜去湿气最快的方法_生姜红糖水的功效
- 和讯个股快报:2023年03月17日 怡达股份(300721)股价5分钟涨速大于1%
- 环球看热讯:福克斯干式双离合好不好_双离合好不好
- 当前快看:当好企业的“服务员”“协调员”
- 快资讯丨光信息科学与技术属于哪一类期刊_光信息科学与技术属于哪一类
- 全球百事通!林肯股票为长岛工业资产提供75万美元
- 国樽动态|国樽律所成为辽宁省发改委法律顾问-世界热资讯
- 每日讯息!汕头超声:业绩下滑仍大举分红,核心技术人员疑入职竞争对手企业|IPO观察
- 长实及新地合作项目飞扬第2期首批88伙 入场306万港元起 当前最新
- 湖人两个坏消息!哈姆赛后很不满,替补悍将应首发,拉塞尔该反思_当前最新
广告
广告
- 世界滚动:中光防雷(300414):独立董事提名人声明(一)
- 全球头条:外媒:乌克兰富豪总资产较俄乌冲突前缩水逾200亿美元
- 全球焦点!回首·2022 | 长江黄河、黑土湿地……纵览2022美丽中国新画卷
- 当前视点!3299起我要冠军版!红米K60Pro还是你的菜吗?
- 今日视点:日本长期利率调整的市场效应
- 【全球热闻】跨越8800公里,爱尔兰面包蟹爬上中国人的餐桌
- 全球今头条!铜陵有色:公司没有独立的镍矿资源,公司的镍产品是冶炼的副产品之一,作为资源综合回收利用
- 资讯:倒计时5天!多家“重庆造”新能源汽车应声涨价
- 天天微动态丨2023年将成钠电产业化元年
- 天天最新:【和讯期货早报】大有期货-油脂-12月26日
- 【环球时快讯】赛升药业(300485.SZ)参股公司康乐卫士北交所上市获审核通过
- 世界通讯!捷信超贷贷款逾期1个月不还会上征信吗
- 前沿资讯!平安新一贷逾期12个月会不会上征信啊
- 【独家】三维通信: 三维通信公司章程(2022年12月)
- 今日讯!息县公安局扎实推进今冬明春禁种铲毒工作
- 环球精选!我阳了...
- 每日焦点!节能风电: 中节能风力发电股份有限公司章程(第十三次修订)
- 世界热消息:英诺特董秘回复:目前公司的联合检测产品需要在符合国家检验资质的医疗机构使用
- 环球微头条丨货币政策、流动性、房地产 央行这场重磅会议都说到了!
- 今头条!美吉姆最新公告:股东张源减持到期已减持300万股 拟再减持不超1.98%股份






