第1章:认识Shell脚本
第一章:认识Shell脚本
1.1、什么是Shell
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
1.2、什么是Shell脚本(Shell Script)
Shell脚本最常用于系统管理工作,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
1.3、脚本编程语言与编译型语言的区别
许多中型、大型的程序都是用编译型语言写成,例如C、C++、JAVA等。这类程序只要从源代码转换成目标代码(机器语言),便能直接通过计算机来执行。编译型语言的好处就是运行速度快,缺点则是它们多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象。例如在C++里,很难进行”将一个目录里所有的文件复制到另一个目录中”之类的简单操作。
脚本编程语言通常是解释型。这类程序的执行,不需要编译,直接由解释器读入程序代码,并将其转换成内部的形式,再执行,所以运行速度相对编译型语言要慢。请注意,解释器本身是一般的编译型程序。
1.4、为什么要使用Shell脚本
脚本编程语言(Shell脚本)多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点则是脚本编程语言运行速度通常不如编译型语言。不过权衡之下,通常在Linux系统管理方面使用脚本编程是非常高效的。花一个小时写成的简单脚本同样的功能用C或C++来编写实现,可能需要更多的时间。而且一般来说,脚本运行速度已经够快了,快到足以让人忽略它性能上的问题。
1.5、Shell脚本的类型(解释器的种类)
Shell脚本的类型有很多,目前流行的Shell脚本包括ash、bash、ksh、csh、zsh等,用户可以通过查看/etc/shells 文件中的内容来查看自己主机中当前有哪些种类的Shell脚本。
范例:
[root@cloucentos6 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
1.6、一个简单的shell脚本
打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
[root@cloucentos6 home]# vim test.sh #使用vim文本编辑器编写test.sh脚本
#!/bin/bash
echo "hello world!"
[root@cloucentos6 home]# chmod +x test.sh #赋予test.sh执行权限
[root@cloucentos6 home]# ./test.sh #执行test.sh脚本
hello world!
1.7、Shell脚本第一行#!意义
标注:如果脚本作为sh的命令行参数运行,脚本第一行声明#!/bin/bash就不起作用。
Shell脚本开头第一行基本都以#!打头,它不是注释,"#!/bin/sh"是对shell的声明,说明你所用sh解释器及/bin/sh是sh的路径;告诉操作系统, 此脚本的解释器为 /bin/sh 这个可执行文件, 如果你的脚本用 bash解释, 第一行就应该是
#!/bin/bash
如果Shell脚本没有这样定义的第一行, 不同 unix 类操作系统会用默认 shell 来解释脚本, 如 unix 往往是 sh, linux 往往是用 bash等等。本教程主要采用bash解释器。
1.8、Shell 脚本两种执行方式
打开终端一般都会出现一个提示符,其形式通常如下所示:
[root@cloucentos6 home]#
或
bash-4.1$
其中#代表系统超级用户,$代表系统普通用户。超级用户是Linux系统中权限最高的用户。
shell脚本运行方式一:将test.sh脚本作为sh的命令行参数运行
[root@cloucentos6 home]# sh test.sh #假设test.sh脚本位于当前/home目录下
[root@cloucentos6 home]# sh /home/test.sh #使用test.sh完整路径
[root@cloucentos6 home]# /bin/sh test.sh
shell脚本运行方式二:将test.sh脚本赋予执行权限的可执行文件,即chmod +x test.sh
[root@cloucentos6 home]# ./test.sh #此命令 ./表当前目录
[root@cloucentos6 home]# /home/test.sh #使用test.sh脚本的完整路径
1.9、变量
变量从字面上就是可以变化的量,每一个变量的值都是字符串,无论变量赋值有没有使用引号,值都会以字符串的形式存储。脚本语言通常不需要在使用变量之前声明其类型,只需要直接赋值即可。有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量被称为环境变量。
变量的定义,只能以字母和下划线开始,区分大小写,可以包含数字、字母或下划线符号。
变量的赋值的方式为:先写变量名称,紧接着=字符,最后就是新值,中间完全没有任何空格;当你想取出Shell变量的值时,需在变量名称面前加上$字符;当变量所赋予的值内含空格时,需要加上双引号;当几个变量连接起来时,也需要使用双引号。
标注:变量赋值var=value不能写成var = value,前者是赋值操作,后面是相等操作。获取var变量的值可以使用echo $var 或 echo ${var}
范例1:
[root@localhost home]# vim test.sh #编写一个test.sh脚本
#!/bin/sh
var1=hello
echo $var1
var2=man!
echo ${var2}
var3="hello boy!"
echo $var3
var4="$var1 $var2 $var3"
echo $var4
[root@localhost home]#./test.sh #执行test.sh脚本,运行后结果如下
hello
man!
hello boy!
hello man! hello boy!
获取字符串长度,length=${#var}
范例2:
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
var=1234567890
echo ${#var}
[root@cloucentos6 home]# ./test.sh
10
1.10、简单跟踪shell脚本
范例1:使用选项 –x启动跟踪调试shell脚本
[root@localhost home]#sh -x ./test.sh #通过sh -x跟踪test.sh脚本
+ sh -x ./test.sh
+ echo 'hello!man'
hello!man
+ printf 'hello!boy\n'
hello!boy
范例2:通过set -x 命令在test.sh脚本指定跟踪到一小部分,然后在使用 set +x闭关跟踪功能。
[root@localhost home]#vim test.sh #只跟踪text.sh脚本里的echo hello!man这行命令
#!/bin/sh
set -x
echo hello!man
set +x
printf "hello!boy\n"
[root@localhost home]# ./test.sh
+ ./test.sh
+ echo 'hello!man'
hello!man
+ set +x
hello!boy
通过在脚本第一行声明#!/bin/bash修改成 #!/bin/bash –xv同样也能启用跟踪调试功能。