该文章根据 the unix workbench 中的 Bash Programming
进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容进行补充修正。一是我对 Bash 的学习记录,二是对大家学习 Bash 有更好的帮助。如对该博文有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。本篇博文可能比较冗长,请耐心阅读和学习。
Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。Shell 是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境。Shell 接收到用户输入的命令,将命令送入操作系统执行,并将结果返回给用户。其次,Shell 是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用 Shell 命令写出各种小程序,又称为脚本,这个也是本篇重点讲解的部分。
开发环境 既然学的是 Bash ,那么必然是任何 Linux 发行版。至于用什么编辑器都可以。不过我个人建议使用VSCode + Bash Extension Pack
进行学习,因为它有纠错功能,并指出一些不合适的写法,我也会在本篇末也会介绍一些。我羽夏使用的就是我建议使用的工具,我也默认你使用的是它,如果用其他的自己酌情参考。下面开始进入正题:
好,在阳光明媚、微风和煦(bushi)的一天,我们信心满满的开始了 Bash 的学习旅程。熟练的打开 VSCode ,进入 Bash 工作区,然后新建了一个名字叫math.sh
的干净纯洁的文件,然后输入了以下内容:
#!/bin/bash
# File: math.sh
注意,你不要复制和粘贴这些行到文件中,尽管你应该准确地输入我输入的的内容。写代码时你应该尽可能多地自己练习,因为写代码是一个实践性十分强的项目,不能眼高手低。这两行都以#
开头,在 Bash 编程语言中,在#
之后键入的任何内容都将被忽略(除非位于花括号之间,但这仅在非常特定的情况下)。#
允许你在代码中进行注释,以便以后的你理解你当下写的代码,也可以使其他人更快地知道你的程序是如何设计的。
但是,上面的内容的第一行代码具有特殊的含义,虽然它是注释。该行被称为 Shebang 行。脚本的第一行通常是指定解释器,即这个脚本必须通过什么解释器执行,而这一行以#!
字符开头,正如上面展示的。
#!
后面就是脚本解释器的位置,Bash 脚本的解释器一般是/bin/sh
或/bin/bash
。
#!/bin/sh
或者
#!/bin/bash
#!
与脚本解释器之间有没有空格,都是可以的。如果 Bash 解释器不放在目录/bin
,脚本就无法执行了。为了保险,可以写成下面这样。
#!/usr/bin/env bash
上面命令使用env
命令,这个命令总是在/usr/bin
目录,返回 Bash 可执行文件的位置,从而避免了这个问题。
Shebang 行不是必需的,但是建议加上这行。如果缺少该行,就需要手动将脚本传给解释器。举例来说,脚本是script.sh
,有 Shebang 行的时候,可以直接调用执行。
wingsummer@wingsummer-PC ~ → ./script.sh
上面例子中,script.sh
是脚本文件名。脚本通常使用.sh
后缀名,不过这不是必需的。如果没有 Shebang 行,就只能手动将脚本传给解释器来执行。
wingsummer@wingsummer-PC ~ → /bin/sh ./script.sh
或者
wingsummer@wingsummer-PC ~ → bash ./script.sh
注意,“只要指定了 Shebang 行的脚本,可以直接执行”这句话有个前提条件,就是脚本需要有执行权限,否则这行也是没作用的。
数学运算 内容讲解 Bash 编程语言可以完成非常基本的算法,现在你在 VSCode 打开了math.sh
这个文件,我们开始输入下面内容:
#!/usr/bin/env bash
# File: math.sh
expr 5 + 2
expr 5 - 2
expr 5 \* 2
expr 5 / 2
保存,并在终端去执行它,你将会得到如下结果:
7
3
10
2
让我们分析一下刚才创建的 Bash 脚本中发生了什么。Bash 按照从文件的第一行到最后一行的顺序执行程序。expr
命令可用于计算 Bash 表达式。表达式只是一个有效的 Bash 代码字符串,在运行时会生成一个结果。您已经熟悉的加法(+)、减法(-)和乘法(*)的算术运算符的工作方式与您预期的一样。请注意:在进行乘法运算时,需要转义星号字符,否则 Bash 会认为您正在尝试创建正则表达式。由于5 / 2 = 2.5
,除法运算符(/)的工作方式与预期不同。Bash 进行整数除法,这意味着一个数除以另一个数的结果总是向下舍入到最接近的整数。让我们看一下命令行上的几个示例:
expr 1 / 3
expr 10 / 3
expr 40 / 21
expr 40 / 20
另一个你可能不熟悉的数值运算符是模运算符(%)。模运算符返回整数除法后的余数。在整数除法中,如果A / B = C
,A % B = D
,那么B * C + D = A
。让我们看看命令行上的一些示例:
expr 1 % 3
expr 10 % 3
expr 40 % 21
expr 40 % 20
然后是它的执行结果:
1
1
19
0
注意,当一个数完全可被另一个数整除时,模的结果为零。如果你想做更复杂的数学运算,比如分数和小数,那么我强烈建议将echo
和名为bc
的台式计算器程序结合起来。打开一个名为bigmath.sh
的新文件并输入以下内容:
#!/usr/bin/env bash
# File: bigmath.sh
echo "22 / 7" | bc -l
echo "4.2 * 9.15" | bc -l
echo "(6.5 / 0.5) + (6 * 2.2)" | bc -l
如下是计算结果:
3.14285714285714285714
38.430
26.20000000000000000000
为了在计算中使用十进制数,可以使用-l
标志将任何数学字符串传输到bc
。
- Bash 程序从文件的第一行到最后一行按顺序执行。
- 在
#
后面写的任何东西都是注释,Bash 不会执行。 - 可以使用
expr
命令执行简单的算术运算。 - 通过使用
echo
将字符串表达式传输到bc
中,执行更复杂的数学运算。
- 请使用命令行查看
bc
的帮助手册。 - 在
bc
交互控制台进行一些数运算。 - 在一个文件中写一些等式,然后将该文件作为参数提供给
bc
。