#1: 创建和运行你的第一个 Bash Shell 脚本

当你学习Linux的shell命令入门之后,可能会发现自己经常在一遍又一遍的重复着相同的任务命令,它可能就是简单的备份一个目录,也可能是清理一下临时文件夹里面的垃圾文件或者临时缓存文件,或者偶尔导出备份一下数据库的数据。

其实在许多场景下,你可以利用bash脚本来实现自动化任务运行。

下面将展示如何创建一个简单的bash shell脚本,如何运行bash shell脚本和一些关于shell脚本的基础知识。

创建和运行你的第一个 Bash Shell 脚本

首先,我们创建一个新的目录,名字就叫做scripts,用来存放咱们这个bash入门系列的脚本。

mkdir scripts
cd scripts

现在进入到这个名为scripts的目录中,使用cat命令创建一个新的文件,名字叫做hello.sh。

cat > hello.sh

在命令终端接下来的输入模式中输入下面的内容:

echo 'Hello, World'

按下 Ctrl + D 将这行文字保存到文件中并退出cat命令.

当然你也可以使用一个基于终端的文本编辑器,例如:vim、emacs或者nano。或者是有图形界面的桌面版的Linux,用类似于gedit这样的文本编辑器来添加上面的这行内容。

虽然可以直接在命令行中使用echo命令打印出“Hello World”,但这个例子是演示如何从一个bashshell的脚本中打印。

接下来就是要用chmod命令给这个hello.sh文件赋予可执行的权限:

chmod u+x hello.sh

最后就是运行这个脚本了,运行的命令很简单,就是在命令行中,脚本的文件名前面加上一个bash:

bash hello.sh

执行完成后,你可以看到在终端中已经输出了Hello,world。怎么样?一个简单的HelloWorld程序脚本就写好了。下面就是整个过程的完整截图。

第一个脚本的执行步骤

转换你其他shell的脚本为bash脚本

上面的例子中,对于初学者而言,是不是感到有点困惑。不用困惑,下面会概要的解释。

Bash是“Bourne-Again shell”的缩写,是Unix系统众多shell版本中的一员。

shell是一个接受并运行命令的命令行解释器。如果您以前有运行过任何Linux命令,那么您一定使用过shell。当您在Linux中打开终端或者远程ssh连接到Linux系统时,就已经运行了系统的默认shell。

Bash通常是大多数Linux发行版中的默认shell。这就是bash在大多数时候与shell同义的原因。

shell脚本开头的“解释伴随行”

一般在Unix系统中的shell脚本,都可以看见第一行是以#和!这两个字符开口,后面跟随这一个命令的绝对路径的情况,例如这样:#! /bin/bash。在一些资料中,这行被叫作shebang(中文为:解释伴随航,简称“释伴”,这是Linux中国防疫组的音译)行。

#! /bin/bash

echo 'Hello, World!'

当你你的脚本最顶行包含有#! /bin/bash的内容,系统就知道你的脚本想使用bash作为这个脚本的解释器,在添加了文件的可执行权限后,就可以直接运行这个脚本,而不用在前面加上 bash。

截图演示在hello.sh文件的顶部添加了#! /bin/bash,然后直接运行。

指定解释器运行

添加你的脚本到系统路径(这样可以在任意目录中运行)

细心的你可能发现,在上面的演示是使用了./hello.sh来运行的,如果把./去掉,会得到一个bash:hello.sh:未找到命令的报错信息。

sean@debian-12:~/scripts$ hello.sh
hello.sh: command not found

因为bash解释器会认为你想要在终端运行一个名为hello.sh的shell命令,当你在终端上运行任何命令的时候,shell解释器会在一个PATH变量中保存的目录中去查找这个命令。

可以通过echo命令来查看PATH的值:

echo $PATH
/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

shell在运行命令时在PATH定义的各个路径中进行查找,这些路径通过冒号(:)进行分割。路径扫描查找的优先级为从左到右,直至找到需要执行的命令或者全部查找但没有找到,返回报错。

像上面用到的echo、cat这些命令可以在任何地方运行,是因为它们都在bin目录中,而PATH里面定义的/usr/bin和/bin都是执行这个目录,在你输入一个命令想要运行该命令时,shell就在PATH保存的这些路径中查找。

如果希望bash脚本可以和Linux的普通命令一样在任何地方直接运行的话,就要把脚本的路径信息也添加到PATH变量里面。

首先通过pwd命令获取脚本的位置信息(这里假设您在上面演示的脚本同一目录下):

pwd

得到脚本的路径后,使用export命令把这个路径添加到PATH。

export PATH=$PATH:/home/username/scripts

注意,一般情况下自定义目录都是添加在标准目录之后的,这样做才不影响正常的标准命令执行。

在命令行使用export导入的路径,在系统重启之后将失效,需要重新再执行一次。如果想永久生效,请在/etc/profile中配置

上面的配合完成后; 直接运行hello.sh查看效果:

sean@debian-12:~/scripts$ hello.sh
Hello, World!

添加脚本的路径 看,现在不用给脚本添加相对或者绝对路径就可以运行了。

第一篇bash的入门教程到此结束。

练习题

自己动手做练习可以帮助你记忆刚学到的东西,下面是几到简单的练习题,用到了上面提到的内容。如果您是初学者,建议您可以自己动手做一下。

练习 1: 我是谁?

写一个shell脚本,打印出你当前登录Linux系统的用户名。

难度级别:容易

提示:可以使用echo命令输出变量名USER的值。

练习 2: 我在哪里?

写一个shell脚本,打印出你当前所在的工作路径。

难度级别:容易

提示:可以使用echo命令输出变量名PWD的值。

练习 3: 我家在哪?

写一个shell脚本,打印出你当前登录系统用户的HOME目录。

难度级别:容易

提示:可以使用echo命令输出变量名HOME的值。

练习 4: 我的默认shell解释器是什么?

写一个shell脚本,打印出你当前系统默认的shell解释器是什么。

难度级别:容易

提示:可以使用echo命令输出变量名SHELL的值。

练习 5: 自我介绍

写一个脚本,输出上面四个问题及其答案,每个答案分行显示。包括您的用户名,当前工作路径,用户的home目录和系统默认shell名称。

难度级别:容易

输出的格式可以参考下面的格式:

Hello

My name is XYZ

My current location is XYZ

My home directory is XYZ

My default shell is XYZ

替换上面模板中的XYZ为您的答案。当然您也可以把这个写成中文的,shell是支持中文输出的。

练习题答案

答案 1: 我是谁?

写一个shell脚本,打印出你当前登录Linux系统的用户名。

#!/bin/bash

echo "$USER"

答案 2: 我在哪里?

写一个shell脚本,打印出你当前所在的工作路径。

#!/bin/bash

echo "$PWD"

答案 3: 我家在哪?

写一个shell脚本,打印出你当前登录系统用户的HOME目录。

#!/bin/bash

echo "$HOME"

答案 4: 我的默认shell解释器是什么?

写一个shell脚本,打印出你当前系统默认的shell解释器是什么。

#!/bin/bash

echo "$SHELL"

答案 5: 自我介绍

写一个脚本,输出上面四个问题及其答案,每个答案分行显示。包括您的用户名,当前工作路径,用户的home目录和系统默认shell名称。

#!/bin/bash

echo "Hello"
echo "My name is $USER"
echo "My current location is $PWD"
echo "My home directory is $HOME"
echo "My default shell is $SHELL"