一、什么是shell
Shell是对操作系统的操作,操作系统进行管理硬件,开发人员通过Shell来和操作系统交流,通过操作系统的命令和操作系统之上的库,以及一些暴露的系统调用进行交流。
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。
Shell是基于命令的语言,Shell脚本语言。
Shell常常用来处理文本,包装一些命令,把Shell包装一些命令,直接调用脚本,直接进行处理一大批命令,最早Shell可以理解为批处理。
最常用的Shell就是bash
特点:
1、简单易学
2、解释性语言,不需要编译即可执行
二、shell的起源
•1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始研发一套可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称为Multics。
•1970年,丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目,他们把这个项目称之为UNICS。
•1973年,使用C语言重新编写了Unix。通过这次编写,使得Unix得以移植到其他的小型机上面。
•1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯恩(Stephen Bourne)的名字命名,叫做Bourne Shell,简称为sh。
•20世纪70年代末,C Shell作为2BSD UNIX的一部分发布,简称csh。
•之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)以及GNU Bourne-Again shell(bash)。
三、脚本的开始
#!/bin/bash这个就是命令解释器,后面的就是相对应得shell
当shell运行的时候,首先读取第一行,决定调用哪一个脚本解释器,得到脚本解释器的类型,Shell有c写的,也有其他语言写的。bash也可以写成sh,linux当中sh已经替换了bash了。
相对关系就是,当前的shell是一个父进程,之后又启动一个bash,执行脚本的命令又是bash的子进程。
四、shell的分类
•Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。
•Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数localhost发行版的默认的Shell。
•Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。
•C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。
如何查看当前系统支持的shell?
[root@ ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
如何查看当前系统默认shell?
[root@kittod ~]# echo $SHELL
/bin/bash
五、执行脚本
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)
chmod +x Shell文件 来给文件加上可执行权限,然后再去./执行就好了
(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)
(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)
(4). filename.sh(和source一样,也是使用当前进程执行)
当我们对一个简单的Shell脚本
如:
#! /bin/bash
pwd
在Shell脚本当中,#表示注释。
第一行说的是shebang,其实就是一个解释器,脚本语言的运行都要依靠这个解释器才行啊。
运行的时候,首先bash进程会进行分出来一个子进程,然后这个子进程进行exec程序替换,替换当前你运行的Shell脚本文件,bash等待子进程终止,然后子进程读取脚本的每一行,然后去fork子进程的子进程。
六、shell中的符号
符号 | 说明 |
---|---|
${} | 表示一个变量的值,例如后面的例子就是表示val的值 |
* | 表示通配符,匹配0个字符到多个任意字符,例如后面的例子说的就是只要带有file.txt的所有的文件 |
$ | 和上面是一样的,通常在不引起歧义的情况下进行使用 |
? | 用来匹配一个任意字符,例如后面的例子只能是形如file1.txt,file2.txt这样的一个位置任意的 |
“ | 双反引号,表示命令替换,例如后面的例子,进行执行pwd |
$() | 和双反引号作用一样,更常用一些 |
’ ‘ | 单引号,用来表示字符串,此时大部分的字符串有个特点是只能取自字面值,如后面的例子,此时只会打印$a,取了字面值 |
” “ | 双引号,用来表示字符串,此时回去解析字符串的特殊含义,例如后面的例子,此时输出的是asd,解析了$a的特殊含义 |
\ | 转义字符需要进行转义的时候进行操作,就可以打印出${},另外,也可以表示续行 |
例子:
[root@localhost day01]# vim b.sh
#!/bin/bash
a='123'
b='456'
c=$a$b
echo $c
[root@localhost day01]# bash b.sh
123456
七、逻辑运算符
运算符 | 说明 |
---|---|
&& | 逻辑与 |
II | 逻辑或 |
另外要注意的Shell和C的区别是,当在Shell当中,条件为真返回0,条件为假返回非0