Bash是“Bourne-Again-Shell”的首字母缩写,是GNU操作系统的Unix Shell或命令语言解释器。现在,我们可以开始好好学习它了。

如果您刚开始使用Linux系统,“Shell脚本”或“Bash脚本”之类的术语可能非常常见——但是它们是什么意思呢?在深入讨论细节之前,学习Bash脚本可以帮助您节省执行和执行各种系统任务的时间,更好地理解Linux命令行(终端)并自动化多个系统任务。

Bash是什么?

Bash是“Bourne-Again-Shell”的首字母缩写,是一种用于GNU操作系统的Unix shell或命令语言解释器。在macOS Catalina之前,它是Linux发行版和苹果macOS发行版的主要shell。Bash也可以在Windows 下的 Linux 子系统Windows Subsystem for Linux(WSL)使用。

Bash通常在终端的文本窗口中运行,用户在其中键入命令来执行各种任务。Bash还可以执行写入文件中的命令,这种方法称为“Bash脚本”。

Bash脚本和Shell脚本的区别

Shell脚本和Bash脚本并不是一回事。使用Bash脚本,您可以显式地使用Bash shell。另一方面,Shell脚本可以是一个相当宽泛的词,因为除了Bash之外,我们还有其他可用的Shell。最常见的一些包括Korn (ksh)、C shell (csh)、Z shell (zsh)和Bash shell (sh)。

在这篇文章中,我们将研究Bash脚本。默认情况下,许多可用的Linux发行版都使用Bash shell。要确认当前Linux发行版上使用的shell,请在终端上执行该命令。

linuxmi@linuxmi:~/www.linuxmi.com$ echo $SHELL
/bin/bash

从上图可以看到,系统中的默认解释器为bash。目前,我正在运行Ubuntu 20.04 LTS。让我们深入学习下!

了解Bash脚本

Bash脚本是包含bash命令的文本文件,这些命令被执行以执行各种任务。要编写这些脚本,您只需要一个简单的文本编辑器,例如gedit,leaf pad,vim,nano等。请记住用.sh扩展名和纯文本而不是富文本格式保存脚本。我最喜欢的用于编写脚本的编辑器之一是nano编辑器。

命名,分配权限和执行Bash脚本

如上所述,请确保对bash脚本使用.sh扩展名。例如,您可以使用名称为的脚本linuxmi.sh。但是,最好是谨慎命名脚本。例如,大多数人喜欢将大多数脚本保存为“test”。鲜为人知的是,有一个称为test的Unix内置命令,该命令检查文件类型并比较值。您可以使用which命令来检查是否存在与脚本名称相同的程序,以防止引起冲突。

which [command]

例子

linuxmi@linuxmi:~/www.linuxmi.com$ which test

从上面的输出中,我们可以看到test已经是一个内置命令。因此,为了避免程序之间的任何冲突,我将不会将我的任何脚本命名为“test”。

要让脚本对每个用户都可执行,请使用下面的命令:

chmod +x linuxmi.sh

要使脚本对于当前用户可执行,请使用以下命令:

chmod u + x linuxmi.sh

现在运行脚本,执行以下命令:

./linuxmi.sh

使用上述方法,您将意识到您将需要使用cd命令移至包含脚本的目录或将路径传递至脚本。但是,有一种解决方法。将脚本保存在主bin 目录中存在的目录中。

对于最近的更新,bin默认情况下,大多数发行版都不随文件夹一起提供。因此,将需要您手动创建它。通过将脚本放置在此文件夹中,可以通过在终端上键入其名称来执行脚本,而无需使用cd和./命令。

Bash脚本编写准则

在编写第一个脚本之前,在编写脚本时需要了解一些准则。

  • 您所有的脚本都应以“#!/bin/bash”行开头。
  • 将每个命令放在新行上。
  • 每个注释都以#符号开头。
  • 命令用()括号括起来。

该#!/bin/bash 语句是路径,我们将使用的shell。如果您使用的是其他shell,则需要编辑此路径。我们了解所有注释均以#符号开头。但是,当带有(!)标记后,该脚本将强制使用此行指向的shell执行。在我们的例子中,它是Bash shell。

您的第一个Bash脚本

与大多数编程语言一样,我们将编写一个脚本,该脚本在执行时会打印“ Hello World”语句。打开您喜欢的文本编辑器,然后粘贴以下命令。将文本文件另存为linuxmi.sh或不是内置命令的任何其他名称。

linuxmi@linuxmi:~/www.linuxmi.com$ nano linuxmi.sh

#!/bin/bash
#这个脚本将在终端上打印“Hello World”                 
echo "Hello World!www.linuxmi.com"

保存文件后,通过执行以下命令使其可执行:

linuxmi@linuxmi:~/www.linuxmi.com$ chmod +x linuxmi.sh

现在,使用以下命令运行它:

linuxmi@linuxmi:~/www.linuxmi.com$ ./linuxmi.sh

上面的脚本只有三行。第一个是我们在上面讨论的Hash-Bang Hack,第二个是注释,第三个是将要执行的命令。注意,注释永远不会执行。

让我们看看您可以利用的其他bash脚本功能。

Echo命令

Echo命令用于在Linux命令行或终端上打印输出。如果您是开发人员,并且以前使用过PHP,那么您一定也遇到过此命令。让我们编写一个小的bash脚本来演示此命令的工作方式。

#!/bin/bash
#让我们打印第一个语句
echo "这是LinuxMi.com - 换行"
#让我们不换行打印第二个语句
echo -n "这是LinuxMi.com - 不换行"

保存脚本,分配所需的权限,然后执行它。

为了理解代码,第一个echo命令打印一条语句并转到下一行。第二个echo命令的-n参数可以防止脚本进入下一行。您可以在Echo命令中使用许多其他选项,包括变量,如下所示。

变量

变量是任何编程语言中常见且必不可少的部分。可以用几种方法声明Bash变量。将值分配给任何变量时,无需使用任何符号。但是,在调用变量的值时,您将需要$在变量的开头使用符号。

您可以在终端上使用变量或将其用作脚本。在终端上执行以下命令。

linuxmi@linuxmi:~/www.linuxmi.com$ myWebsite=”LinuxMi.com”
linuxmi@linuxmi:~/www.linuxmi.com$ echo $myWebsite

现在,让我们创建一个bash脚本,它接受用户的两个输入,并将它们存储在变量$x和$y中。然后,脚本将检查这两个值是否相等。

#!/bin/bash
echo "输入第一个数字"
read a
echo "输入第二个数字"
read b
if [[ $a -eq $b ]]
then
echo "数字是相等的"
else
echo "数字不相等"
fi

现在,让我们仔细看看代码。前两个echo语句提示用户输入第一个和第二个数字。read命令将等待用户输入一个数字并将其存储到指定的变量中。在我们的例子中,这是a和b,然后我们有一个if语句来检查这两个值是否相等。

条件语句

在任何编程语言中,条件语句控制程序的流程。一段代码只会在满足特定条件时执行。一些最常见的条件语句包括“if-then-else”和“case”。下面是if-then-else语句的基本语法。

if [[ 条件 ]]
then
<执行一条指令>
else
<执行另一条指令/命令>
fi

看看下面的脚本,它使用了“if-then-else”条件语句。

#!/bin/bash
echo "输入你的年龄"
read age
if ((age > 18 ))
then
echo "你可以去参加聚会"
else
echo "你没有资格参加聚会"
fi

让我们看一下上面的脚本。我们有echo语句,提示用户输入他们的年龄。read语句存储了输入到变量“age”中的年龄。然后我们有一个if-then-else条件语句,在指示用户之前检查年龄是否大于18岁。

循环

当您希望多次执行一段代码时,通常使用循环。例如,如果我想echo显示1000行的“欢迎来到LinuxMi.com”语句,我需要1000个echo语句。但是,对于循环,我所需要做的就是指定语句在终端上被echo或打印的次数。Bash支持三种循环:For循环,While循环和Until循环。让我们逐个来仔细分析。

For循环

For循环用于遍历指定数据或数组的列表。下面是Bash For循环的基本语法;

for Value in 1 2 3 4 5 .. N
do
instruction1
instruction2
instruction-N
done

或者

for VALUE in file1 file2 file3
do
instruction1 on $VALUE
instruction2
instruction-N
done

看看下面的脚本。遍历一周中的给定日期,并将它们逐行打印在终端上。

#在循环的每次迭代中读取一个工作日的名称
for day in 星期一 星期二 星期三 星期四 星期五 星期六 星期日
do
echo "$day"
done

让我们将脚本另存为linuxmi.sh并执行它。下面是输出的屏幕截图。

那只是您可以使用For循环执行的简单示例。您也可以将其与条件语句结合使用以完成特定任务。

While循环

While循环在特定条件保持为True时执行特定任务。在每次迭代中,循环将在执行指令之前先检查条件。当条件为False时,循环将终止。bash While循环的基本语法如下:

while [CONDITION]
do
[COMMANDS]
done

例如,我们可以有一个脚本,该脚本将打印“ 欢迎来到LinuxMi.com”语句7次,直到将变量X设置为7。让我们尝试实践一下。看看下面的脚本。

#!/bin/bash
x=1
while [ $x -le 7 ]
do
echo "欢迎来到LinuxMi.com"
x=$(( $x + 1 ))
done

让我们将脚本另存为linuxmi.sh并执行它。下面是输出的屏幕截图。

让我们看一下上面的While循环脚本。我们首先声明一个变量X,赋值为1。然后我们创建一个While语句,它输出语句“欢迎来到LinuxMi.com”。而X小于7。最后,我们在每次迭代后对X加1。

Until循环

只要set条件的计算结果为false,则使用Bash Until循环执行一组指令或命令。下面是Until循环的基本语法。

until [CONDITION]
do
[INSTARUCTIONS/COMMANDS]
done

与While循环类似,Until循环在执行指令或命令之前首先计算设置的条件。如果条件的计算结果为false,则执行指令。当条件的值为true时,循环终止。看看下面的例子。

#!/bin/bash
count=0
until [ $count -gt 5 ]
do
echo 计数: $count
((count++))
done

保存并运行上面的脚本后,我们得到如下输出:

上面的脚本首先创建一个变量count并将其设置为zero(0)。这就是控制程序流程的条件。Until循环检查计数值是否大于5。如果不是,它将打印通过的指令。但是,如果值大于5,循环将立即终止。最后,我们将计数值增加1 (count++)。

Bash函数

在编程和脚本中,函数用于保存执行特定任务所需的可重用代码段。因此,如果您希望在脚本的不同部分执行类似的命令,则不需要重复编写这些命令。将它们封装在一个函数中并执行该函数。

下面是Bash函数的基本语法。

function_name () {
<instructions/commands>
}

或者

function function_name {
<instructions/commands>
}

让我们创建一个使用函数的简单脚本。我们首先创建一个名为“ lmFunction”的函数,该函数在被调用时输出语句“你好,我是第一个函数”。第二个函数“ lmCities”由于接受了传递的参数而有些高级。调用函数名称后给出参数。它们可以在函数中以$1的形式访问。

#!/bin/bash
lmFunction () {
echo "你好,我是第一个函数"
echo "你好,我是第一个函数"
echo
}

echo "这是第二个函数"
function lmCities () {
echo Hello $1
}
lmFunction
lmCities www.linuxmi.com
lmCities Linux迷,当年的大师兄

保存并执行脚本之后,我们得到下面的输出。

Bash的菜单

当编写脚本执行高级任务时,您可能需要用户从终端上显示的几个选项中选择一个选项。为此,我们将使用bash select命令。

它创建一个简单的菜单脚本,提示用户从列表中选择他们喜欢的Linux发行版。看看下面的脚本。

#!/bin/bash

#为用户打印消息
echo "选择您最喜欢的Linux发行版"
select distro in Ubuntu Fedora OpenSUSE Debian Parrot ArchLinux Kali
do
#打印所选值
if [[ $distro == "Exit" ]]
then
exit 0
else
echo "所选的Linux发行版是 $distro"
fi
done

让我们将脚本保存为linuxmi.sh并执行它。我们得到下面的输出。

在上面的脚本中,我们有一个包含七个Linux发行版的列表,用户将从中选择一个。在他们做出选择之后,它将存储在变量发行版中,然后通过将其与字符串“所选的Linux发行版是”连接在一起进行打印。Bash选择菜单可能非常有用,特别是当您有多个脚本执行不同的任务,并且一个脚本必须选择它们希望执行的那个脚本时。

算术

每种编程语言都支持执行算术操作,bash脚本也不例外。但是,我们执行算术运算的方式略有不同。下面是在bash中执行算术操作的一种方法。我们将研究四种类型的算术运算—和、除法和乘法。

#!/bin/bash
# 计算总和
result=$((80+7))
# 打印和
echo "和 = $result"

# 计算减法
result=$((98-7))
# 打印差
echo "差 = $result"

# 计算除法
result=$((66/6))
# 打印商
echo "商 = $result"

#计算乘法
result=$((19*19))
echo "积 = $result"

让我们将上面的脚本保存为linuxmi.sh并执行它。我们得到下面的输出。

总结

这是一个关于开始使用Bash脚本的完整的初学者指南。然而,除了本教程介绍的内容外,Bash还有更多内容。我建议您提高技能的一个地方是GNU的Bash参考手册。如果你对这篇文章有任何问题或疑问,请在下面的评论栏里给我们留言。

发表评论