#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"