shell
Shell脚本基本语法和应用
概念和原理
Shell是什么?linux
- Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
- Shell 是指一种应用程序,这个应用程序提供了一个界面,用户经过这个界面访问操做系统内核的服务,用户的大部分工做都是经过Shell完成的
- 在Unix和linux上的内核上执行
- shell是最重要的实用程序,深刻了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键

Shell脚本git
- Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
- 业界所说的 shell 一般都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不一样的概念
- Shell脚本语言既是一种命令语言,又是一种程序设计语言
- Shell脚本和编程语言很类似,也有变量和流程控制语句,但Shell脚本是解释执行的,不须要编译
- Shell程序从脚本中一行一行读取并执行这些命令,至关于一个用户把脚本中的命令一行一行敲到Shell提示符下执行

Shell有两种执行命令的方式github
交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。web
批处理(Batch):用户事先写一个Shell脚本(Script),其中有不少条命令,让Shell一次把这些命令执行完,而没必要一条一条地敲命令。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脚本解释权器)ruby
- 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中执行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 父进程下执行