第1章:认识Shell脚本

时间:2023-03-10 01:15:46
第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同样也能启用跟踪调试功能。