一、什么是shell?
shell是一个用C语言编写的程序,是用户使用Linux的桥梁。shell既是一种命令语言,又是一种程序设计语言,可以说Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。。
二、什么是shell脚本?
shell脚本(shell script)是一种为shell编写的脚本程序。业界所说的shell通常是指shell脚本,但是要知道shell与shell script是两个不同的概念。
三、如何编写shell脚本?
1.要创建一个脚本,可以用touch指令创建一个空的.sh后缀的脚本。
2.在第一行中添加一个约定的标记: #!/bin/bash,意为告诉脚本用哪一种shell解释器来执行。
3.在脚本中编写命令,完成后用: :wq! 保存
4.添加运行权限,方法为chmod+x脚本名.添加权限后./脚本名即可运行脚本
5.shell解释器是什么?
shell解释器也是一个程序,当我们登陆linux系统,输入用户名和密码后,就已经开始执行shell解释器程序来,通常是/bin/bash也可以是别的,比如/bin/sh
四、常见的 Shell 有 那些?
Linux 是一个开源的操作系统,由分布在世界各地的多个组织机构或个人共同开发完成,每个组织结构或个人负责一部分功能,最后组合在一起,就构成了今天的 Linux。例如:
- Linux 内核最初由芬兰黑客 Linus Torvalds 开发,后来他组建了团队,Linux 内核由这个团队维护。
- GNU 组织开发了很多核心软件和基础库,例如 GCC 编译器、C语言标准库、文本编辑器 Emacs、进程管理软件、Shell 以及 GNOME 桌面环境等。
- VIM 编辑器由荷兰人 Bram Moolenaar 开发。
1.sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
2.sh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。
3.tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
4.ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
5.bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。
bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
注意:bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。
尽管如此,bash 和 sh 还是有一些不同之处:
一方面,bash 扩展了一些命令和参数;
另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
五、在linux系统下如何查看shell?
Shell 是一个程序,一般都是放在/bin
或者/usr/bin
目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells
文件中。/etc/shells
是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。
通过 cat 命令来查看当前 Linux 系统的可用 Shell:
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
特别提醒:
在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh
往往是指向/bin/bash
的符号链接。
如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:
$ echo $SHELL
/bin/bash
输出结果表明默认的 Shell 是 bash。echo
是一个 Shell 命令,用来输出变量的值。SHELL
是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。
六、在Linux系统下编写一个Shell 程序
一、编写shell脚本文件:
打开文本编辑器,新建一个文本文件,并命名为 test01.sh。
注意:扩展名sh
代表 shell,扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用php
好了。
在 test01.sh 中输入代码:
#!/bin/bash
echo "Hello World !" #这是一条语句
第 1 行的#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash
就是指明了解释器的具体位置。
第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指显示器)输出文本。在.sh
文件中使用命令与在终端直接输入命令的效果是一样的。
第 2 行的#
及其后面的内容是注释。Shell 脚本中所有以#
开头的都是注释(当然以#!
开头的除外)。写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,也方便后期自己维护时看懂自己的脚本——实际上,即便是自己写的脚本,在经过一段时间后也很容易忘记。
下面给出了一段稍微复杂的 Shell 脚本:
#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"
第 5 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量。read 命令用来从标准输入文件(Standard Input,stdin,一般就是指键盘)读取用户输入的数据。
第 6 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$
,否则变量名会作为字符串的一部分处理。
二、执行shell脚本
行 Shell 脚本有两种方法,一种在新进程中运行,一种是在当前 Shell 进程中运行
1)在新进程中运行 Shell 脚本
在新进程中运行 Shell 脚本有多种方法。
1) 将 Shell 脚本作为程序运行
Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限),如下所示:
[gufengchen@localhost ~]$ cd demo #切换到 test.sh 所在的目录
[gufengchen@localhost demo]$ chmod +x ./test.sh #给脚本添加执行权限
[gufengchen@localhost demo]$ ./test.sh #执行脚本文件
Hello World ! #运行结果
第 2 行中,chmod +x
表示给 test.sh 增加执行权限。
第 3 行中,./
表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./
,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。
通过这种方式运行脚本,脚本文件第一行的#!/bin/bash
一定要写对,好让系统查找到正确的解释器。
2) 将 Shell 脚本作为参数传递给 Bash 解释器
你也可以直接运行 Bash 解释器,将脚本文件的名字作为参数传递给 Bash,如下所示:
[gufengchen@localhost ~]$ cd demo #切换到 test.sh 所在的目录
[gufengchen@localhost demo]$ /bin/bash test.sh #使用Bash的绝对路径
Hello World ! #运行结果
通过这种方式运行脚本,不需要在脚本文件的第一行指定解释器信息,写了也没用。(不需要使用chmod + 赋权限)
更加简洁的写法是运行 bash 命令。bash 是一个外部命令,Shell 会在 /bin 目录中找到对应的应用程序,也即 /bin/bash
(不需要使用chmod + 赋权限)
[gufengchen@localhost ~]$ cd demo
[gufengchen@localhost demo]$ bash test.sh
Hello World
这两种写法在本质上是一样的:第一种写法给出了绝对路径,会直接运行 Bash 解释器;第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。
三 、完整的shell脚本程序编写用例及执行:
1、新建一个 xx.sh文件;
2、使用vi或者vim命令编辑xx.sh文件并保存:
3、使用chmod给脚本文件赋予执行权限:chmod a+x./xx.sh
4、执行shell脚本./xx.sh
四、在当前进程中运行 Shell 脚本
这里需要引入一个新的命令——source 命令。source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。
source 命令的用法为:
source filename
也可以简写为:
. filename
两种写法的效果相同。对于第二种写法,注意点号.
和文件名中间有一个空格。
比如,使用 source 运行上节的 test05.sh:
[gufengchen@localhost test]$ vim test05.sh #编写一个shell脚本文件
[gufengchen@localhost test]$ source ./test05.sh #使用source ./ 运行
Hello World
[gufengchen@localhost test]$ source test05.sh #使用source
Hello World
[gufengchen@localhost test]$ . test05.sh #使用 . 执行
Hello World
[gufengchen@localhost test]$ cat test05.sh
#!/bin/bash
echo "Hello World" #输出Hello World
[gufengchen@localhost test]$
使用 source 命令不用给脚本增加执行权限,并且写不写./
都行,是不是很方便。
[gufengchen@localhost test]$ echo $$
9102 #当前进程PID
[gufengchen@localhost test]$ source ./check.sh
9102 #Shell脚本所在进程PID
[gufengchen@localhost test]$ echo $$
9102 #当前进程PID
[gufengchen@localhost test]$ . ./check.sh
9102 #Shell脚本所在进程PID
[gufengchen@localhost test]$
进程的 PID 都是一样的,当然是同一个进程了
如果需要在新进程中运行 Shell 脚本,我一般使用bash test.sh
这种写法;如果在当前进程中运行 Shell 脚本,我一般使用. ./test.sh
这种写法。这是我个人的风格。