怎样用 Bash 编程:语法和工具( 二 )


这里需要特别讲解一个标点符号 。当你在命令行输入一条命令,按下回车键的时候,其实在命令的末尾有一个隐含的分号(;) 。当一段 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 。下面实践一下,仍然是创建新目录:


推荐阅读