一、Shell 是什么
Shell 是用户与 Linux 操作系统沟通的桥梁。虽然 shell 脚本并不能完成像其他主流的跨平台编程语言那样多的复杂功能。但他在自动化运维中却扮演着非常重要的角色。对于程序员而言,特别是目标程序需要在 Linux 上运行的程序员,会一些基本的 shell 编程可能会大大提高工作效率。比如可以使用 shell 来实现进程监控、自动化部署、资源备份等等。
Linux 的 Shell 种类众多,这里我们学习的是 bash,也就是 Bourne Again Shell
- 由于易用和免费,Bash 在日常工作中被广泛使用
- Bash 是大多数 Linux 系统默认的 Shell
二、shell编程工具
由于 shell 是一门脚本语言,因此写shell脚本不需要编译器环境(与基本脚本语言一样,与 java 需要 JDK 不同)、也不需要集成开发环境(IDE,比如 eclipse 这种集成开发环境)。
所有的工具只是一个文件编辑器。Vim 与 Emacs 无疑是 shell 编程的首选工具,这也是大部分主流程序员的选择。图形化的 gedit 和 kate 也是不错的选择,它们都支持对 shell 脚本的语法高亮。
三、第一个程序:Hello World
如果你学过某一门编程语言,那我相信你一定对这个入门的程序有所耳闻。它是最古老、最经典的入门程序。在大多的编程语言学习书籍或者教程里,它都是作为入门的第一个程序被介绍。
这个程序的功能是在标准输出(命令行或者控制台)打印一行字符串”Hello World”。借用这样一个程序,可以来看一看一个shell程序的构成。
3.1 建立程序
使用文件编辑器建立一个名为hello的文件
[jiang@localhost ~]$ vi hello
hello文件中包含如下内容
#! /bin/bash
# Display a line
echo "Hello World"
保存退出vi编辑器。至此,一个简单的shell程序便编写完成。
3.2 执行程序
要执行这个程序,首先应该要为它加上可执行权限。完成操作后,就可以运行此程序了。
[jiang@localhost ~]$ ll hello ## 查看hello的权限
-rw-rw-r--. 1 jiang jiang 50 Jul 24 16:18 hello
[jiang@localhost ~]$ chmod u+x hello ## 为hello增加所有者的执行权限
[jiang@localhost ~]$ ./hello ## 执行脚本
Hello World
3.3 解析程序
3.3.1 Shell 程序文件扩展名
Shell 文件的扩展名通常是 “.sh”。但是,请注意,这只是编程人员的一种约定俗成的规范。事实上,Linux 系统中对文件的扩展名并不严格控制,因此,你可以为你的 shell 程序文件起任何 Linux 文件系统可以支持命名的名字。从我们刚才的文件名 hello 你应该能够看出这点,你甚至都不用为它设置一个扩展名,这丝毫不会影响Shell程序的执行。(如果你是一名Windows 的习惯用户,才刚刚接触到Linux系统,那么你可能需要转变一下在 Windows 下养成的习惯思维,不过这并不是重要的事情)。
3.3.2 文件头声明
#! /bin/bash
这一行告诉 Shell,运行这个脚本时应该使用哪个 Shell 程序。本例中使用的是 /bin/bash,也就是 BASH。一般来说,Shell 程序的第一行总是以 “#!” 开头,指定脚本的地运行环境。尽管在当前环境就是 BASH Shell 时可以省略这一行,但这并不是一个好习惯。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell。所以,在这里,我们可以看到 #! /bin/bash,它同样也可以改为 #! /bin/sh。
3.3.3 Shell注释
# Display a line
以 “#” 开始的行是注释,Shell 会直接忽略 “#” 号后面的所有内容。保持写注释的习惯无论对别人(团队协作)还是对自己(当你一段时间后来 review 这个程序)都是很有好处的。
3.3.4 忽略空行
和几乎所有编程语言一样,Shell 脚本会忽略空行。用空行分割一个程序中不同的任务或者模块代码是一个良好的编程习惯。
3.3.5 程序内容
echo "Hello World"
echo 命令把其后面的参数传递给标准输出。如果参数是一个字符串的话,那么应该用双引号或者单引号把它包含起来。echo 命令最后会自动加上一个换行符。
在 Shell 程序中,你可以调用 Linux 的命令执行任务,也可以调用其他的可以运行的命令来执行任务。
四、脚本执行的常用方式
a.sh
这种方式需要保证脚本具有执行权限并且在环境变量 PATH 中有. (即当前目录),这样在执行的时候会从当前目录查找。
./a.sh
只要保证这个脚本具有执行权限即可
/usr/local/a.sh
只要保证这个脚本具有执行权限即可
bash a.sh
直接可以执行,这个脚本文件中的第一行都可以不引入 /bin/bash,它是将 a.sh 作为参数传给sh(bash) 命令来执行的。
注:
执行权限是 Linux 文件系统中对文件的操作权限之一(读、写、执行),权限为 x,权重为1。