# Bash介绍与入门

# 什么是 Bash

# 简介

Bash(GNU Bourne-Again Shell)是一个为 GNU 计划编写的 Unix shell,它是许多 Linux 平台默认使用的 shell。

shell 是一个命令解释器,是介于操作系统内核与用户之间的一个绝缘层。准确地说,它也是能力很强的计算机语言,被称为解释性语言或脚本语言。它可以通过将系统调用、公共程序、工具和编译过的二进制程序”粘合“在一起来建立应用,这是大多数脚本语言的共同特征,所以有时候脚本语言又叫做“胶水语言”。

事实上,所有的 UNIX 命令和工具再加上公共程序,对于 shell 脚本来说,都是可调用的。Shell 脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的编译型程序语言。

# 为什么学 Bash

对于任何想适当精通一些系统管理知识的人来说,掌握 shell 脚本知识都是最基本的,即使这些人可能并不打算真正的编写一些脚本。

学一个东西,我们大部分情况都是往实用性方向着想。从工作角度来讲,学习 Shell 是为了提高我们自己工作效率,提高产出,让我们在更少的时间完成更多的事情。

很多人会说 Shell 编程属于运维方面的知识了,应该是运维人员来做,我们做后端开发的没必要学。我觉得这种说法大错特错,相比于专门做Linux运维的人员来说,我们对 Shell 编程掌握程度的要求要比他们低,但是shell编程也是我们必须要掌握的!

目前Linux系统下最流行的运维自动化语言就是Shell和Python了。

两者之间,Shell几乎是IT企业必须使用的运维自动化编程语言,特别是在运维工作中的服务监控、业务快速部署、服务启动停止、数据备份及处理、日志分析等环节里,shell是不可缺的。Python 更适合处理复杂的业务逻辑,以及开发复杂的运维软件工具,实现通过web访问等。Shell是一个命令解释器,解释执行用户所输入的命令和程序。一输入命令,就立即回应的交互的对话方式。

另外,了解 shell 编程也是大部分互联网公司招聘后端开发人员的要求。

# 初步练习

# Hello World

Bash 之 Hello World

vim hello.sh
1

使用 vim 编辑 hello.sh,输入如下代码并保存:

#!/bin/bash
# This is a comment
echo Hello World
1
2
3
  • vim 中插入按 i
  • 保存并退出换行按 esc 然后输入 :wq 再按下 enter
  • #! 是说明 hello 这个文件的类型,有点类似于 Windows 系统下用不同文件后缀来表示不同文件类型的意思(但不相同)。
    • Linux 系统根据 #! 及该字符串后面的信息确定该文件的类型,可以通过 man magic 命令 及 /usr/share/magic 文件来了解这方面的更多内容。
    • 在 BASH 中 第一行的 #! 及后面的 /bin/bash 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下,如果你的 Linux 系统比较特别,bash 也有可能被存放在 /sbin/usr/local/bin/usr/bin/usr/sbin/usr/local/sbin 这样的目录下;如果还找不到,你可以用 locate bash ,find / -name bash 2>/dev/nullwhereis bash 这三个命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个 BASH 软件包了。
  • 第二行的 # This is a ... 就是 BASH 程序的注释,在 BASH 程序中从 # 号(注意:后面紧接着是 ! 号的除外)开始到行尾的部分均被看作是程序的注释。
  • 第三行的 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去。由于 echo 后跟的是 "Hello World" 这个字符串,因此 "Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号

运行 Bash 脚本的方式:

# 使用shell来执行
sh hello.sh

# 使用bash来执行
bash hello.sh

# 使用.来执行
. ./hello.sh

# 使用source来执行
source hello.sh

# 还可以赋予脚本所有者执行权限,允许该用户执行该脚本
chmod u+rx hello.sh
./hello.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 使用重定向

比如我们想要保存刚刚的 hello world 为一个文本,那么该怎么办呢?

> 这个符号是重定向,执行以下代码,就会在当前目录下生成一个 my.txt。打开看看有没有 hello world

 #!/bin/bash
 echo "Hello World" > my.txt
1
2

# 使用脚本清除 /var/log 下的 log 文件

首先我们看一看 /var/log/dpkg.log 里面有啥东西。

cat /var/log/dpkg.log
1

这个文件中记录了我们使用 apt 安装的软件包的一些信息,现在我们需要写一个脚本把里面的东西清空,但是保留文件。

vim cleanlogs.sh
1

说明:

/dev/null 这个东西可以理解为一个黑洞,里面是空的(可以用 cat 命令看一看)。

#!/bin/bash

# 初始化一个变量
LOG_DIR=/var/log

cd $LOG_DIR

cat /dev/null > dpkg.log

echo "Logs cleaned up."

exit
1
2
3
4
5
6
7
8
9
10
11
12

运行脚本前,先使用 sudo chmod +x cleanlogs.sh 授予脚本执行权限,然后再看看 /var/log/dpkg.log 文件内是否有内容。运行此脚本后,文件的内容将被清除。

执行:

由于脚本中含有对系统日志文件内容的清除操作,这要求要有管理员权限.不然会报 permission denied 错误。使用 sudo 命令调用管理员权限才能执行成功:

sudo ./cleanlogs.sh
1
  • #!/bin/bash 这一行是表示使用 /bin/bash 作为脚本的解释器,这行要放在脚本的行首并且不要省略。
  • 脚本正文中以 # 号开头的行都是注释语句,这些行在脚本的实际执行过程中不会被执行。这些注释语句能方便我们在脚本中做一些注释或标记,让脚本更具可读性。

# 思考练习

# 遇到权限不够的提示,为什么,如何解决

权限不够加 sudo 啊,可是你会发现 sudo cat /dev/null > /var/log/dpkg.log 一样会提示权限不够,为什么呢?

因为 sudo 只能让 cat 命令以 root 的权限执行,而对于 > 这个符号并没有 root 的权限。

我们可以使用 sudo sh -c "cat /dev/null > /var/log/dpkg.log" 让整个命令都具有 root 的权限执行。

# 为什么 cleanlogs.sh 可以将 log 文件清除

因为/dev/null,里面是空的,重定向到 /var/log/dpkg.log 文件后,就清空了 dpkg.log 文件的内容。