Shell介绍
shell
Shell脚本基本语法和应用
概念和原理
Shell是什么?
- Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
- Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,用户的大部分工作都是通过Shell完成的
- 在Unix和linux上的内核上执行
- shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键
Shell脚本
- Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
- 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念
- Shell脚本语言既是一种命令语言,又是一种程序设计语言
- Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译
- Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行
Shell有两种执行命令的方式
-
交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
-
批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
-
可以通过打印”$-“变量的值(代表着当前设置的Shell选项),来区分交互式与非交互式Shell。
[root@qiudao ~]# echo $- himBH #交互式Shell [root@qiudao ~]# cat 1.sh #!/bin/bash echo $- [root@qiudao ~]# sh 1.sh hB #非交互式Shell #各个字符所代表的含义: 01)h:hashall,打开这个选项后,Shell会将命令所在的路径记录下来,避免每次都要查询。 02)i:interactive,包含这个选项说明当前的Shell是一个交互式的Shell。 03)m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。 04)B:braceexpand,大括号扩展。 05)H:history,Shell会把我们执行的命令记录下来,可以通过history命令查看。
几种常见Shell(Shell脚本解释权器)
- Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。
- bash:bash是Linux标准默认的shell,bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个,Linux使用它作为默认的shell是因为它有诸如以下的特色:
- 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令
- 自动通过查找匹配的方式给出以某字符串开头的命令
- 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助
- sh:sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell
- ash:ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便
- csh:csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh
- ksh:ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了
注意:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行
编译型语言和解释型语言的区别
- 编译型语言
很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”- 优点:由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高
- 缺点:由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码
- 解释型语言
解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行- 优点:它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;缺点是它们的效率通常不如编译型语言
- 缺点:因为每次执行程序都多了编译的过程,因此效率有所下降
不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell
应用场景
Shell脚本可以提高工作效率
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:
- 简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
- 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
- 开发容易:可以在短时间内完成一个功能强大又好用的脚本
但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:
- 资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)
- 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)
- 有跨平台(操作系统)移植需求(一般使用C 或Java)
- 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
- 对于影响系统全局性的关键任务应用
- 私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)
- 需要数据结构的支持,比如链表或数等数据结构。
- 需要产生或操作图形化界面 GUI
- 需要直接操作系统硬件
综上,结合Shell的优缺点和特性,我们使用Shel可以做下面一些事情:
- 将一些复杂的命令简单化(平时我们提交一次github代码可能需要很多步骤,但是可以用Shell简化成一步)
- 可以写一些脚本实现工程自动化操作,比如自动更换最新的sdk(库).
- 自动打包、编译、发布等功能
- 清理磁盘中空文件夹
- 总之一切有规律的活脚本都可以尝试一下
基本语法
放在相同目录 /server/scriptes/
第一个shell脚本
hello world!
执行脚本的三种方式
1)bash test.sh
[root@web01 scripts]# bash test.sh
Hello World!
2)全路径执行
[root@web01 scripts]# chmod +x test.sh
[root@web01 scripts]# /server/scripts/test.sh
Hello World!
3). 或者source执行
[root@web01 scripts]# . test.sh
Hello World!
[root@web01 scripts]# source test.sh
Hello World!
什么区别?
1 2 在子shell中执行
. source 父进程下执行