shell脚本(Shell Script)就是将要执行的命令按照顺序保存到一个文本文件中,并给该文件可执行的权限,方便一次性执行的一个程序文件。
Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个“命令解释器”的角色,负责接受用户输入的操作指令(命令)并进行行解释,将需要执行的操作传递给内核执行,并输入执行结果。
常见的Shell解释器有多种,使用不同的shell脚本时,其内部指令,命令提示等会存在一些区别。
可以通过查看/etc/shells文件可以了解当前系统所支持的Shell脚本的种类。
[root@master ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
其中 /bin/bash 是目前大多数Linux版本采用的默认Shell脚本。
Bash的全称为 Bourne (目的地)Again Shell。
创建第一脚本:first.sh
包含的命令为:cd /boot/ ,pwd,ls -lh vml*。
注意事项:一个合格的脚本程序应该遵循标准的脚本结构,能够输出友好的提示信息。
# bin/bash # 这是我的第一个脚本 cd /boot echo "当前位置位于:" pwd echo "其中以vml开头的文件包括" ls -lh vml*
脚本解释:
第一行的# bin/bash 是一行特殊声明方式,表示以后的语句是通过 /bin/bash程序解析执行。
其他的以#开头的语句表示注释信息。
echo命令用于输出字符串。
其他的就是逻辑的命令了。
将脚本赋予可执行的权限:
chmod + x first.sh
可以用两种运行脚本的方式:
方法一:
./first.sh
方法二:
sh first.sh
执行结果如下:
[root@master myshells]# ./first.sh 当前位置位于: /boot 其中以vml开头的文件包括 -rwxr-xr-x. 1 root root 4.1M May 10 2016 vmlinuz-2.6.32-642.el6.x86_64 [root@master myshells]# sh first.sh 当前位置位于: /boot 其中以vml开头的文件包括 -rwxr-xr-x. 1 root root 4.1M May 10 2016 vmlinuz-2.6.32-642.el6.x86_64
linux中有大量的Shell脚本文件,如 /etc/init.d 目录下的各种服务控制脚本。
由于Shell脚本“批处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预。所以学会提取,过滤执行信息很重要。引出两个I/O操作:管道、重定向
管道操作作为不同命令之间协同工作的一种机制。管道操作符 " | " 。
管道操作符左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
管道命令的使用规范:
cmdl命令 | cmd2命令 [...| cmdn 命令]
在 Shell脚本应用中,管道操作通常用来过滤所需要的关键信息。配合grep命令使用。
Linux系统使用文件来描述各种硬件、设备等资源,如以前学过的硬盘和分区、
光盘等设备文件。用戶通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作
系统进行交互,完成最基本的输入、输出操作。从键盘接收用戶输入的各种命令字串、
辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。
在实际的使用中,可以改变输入、输出内容的方向,而不使用默认的标准输入,输出设备。这种操作就是重定向
重定向输入:是将命令中接收输入的途径有默认的键盘改为指定的文件。而不是等待键盘输入。重定向输入使用 “ < ”操作符。重定向输入用途不多。
重定向输出是指,将命令正常的输入结果保存到指定文件中,而不是直接显示在屏幕上。
重定向输入使用“ >”,或者“>>” 分别代表覆盖和追加。
若重定向的输入的文件不存在时,创建新的文件,将前面的命令的输出结果保存到该文件中。
若重定向的文件存在,则就根据 “ >”,或者“>>” 对输出结果进行 覆盖或者追加到文件中。
例如:正常执行 ./first.sh 脚本
[root@master myshells]# ./first.sh 当前位置位于: /boot 其中以vml开头的文件包括 -rwxr-xr-x. 1 root root 4.1M May 10 2016 vmlinuz-2.6.32-642.el6.x86_64
当执行 ./first.sh > pass ,没有输出结果。将文件保存到pass中
[root@master myshells]# ./first.sh > pass [root@master myshells]#
执行cat pass 查看文件
[root@master myshells]# cat pass 当前位置位于: /boot 其中以vml开头的文件包括 -rwxr-xr-x. 1 root root 4.1M May 10 2016 vmlinuz-2.6.32-642.el6.x86_64
当执行 ./first.sh >> pass ,没有输出结果。将文件保存到pass中。会将输出结果,追加在文件末尾。
错误重定向是将执行命令过程中出现的错误信息(如选项,参数错误等信息)保存到指定文件中,而不是直接输出到屏幕中。
错误重定向使用“ 2>”操作符,其中“2”是指错误文件的编号。(在使用标准输出,输入重定向时,实际省略了1,0编号)“2>>”追加模式
常见变量分为四种:自定义变量,环境变量,位置变量,预定义变量。
自定义变量是由系统用户自己定义的变量。只在用户自己的Shell环境中有效,因此又称本地变量。
在定义一个新的变量时,一般不需要提前声明,而是直接指定变量名,直接赋值即可。
#!/bin/bash #定义变量,等号的左右两边不要有空格。 product=微信 version=12.0
在这里定义一个变量 product 值为 微信 version值为12.0 。
通过在变量名称前面添加“$”,可以引用一个变量的值,使用echo命令可以查看变量,可以在echo命令中查看多个变量值。
#!/bin/bash #定义变量 product=微信 version=12.0 echo $product echo $version echo $product$version ~
执行结果为 :
[root@master myshells]# ./sec 微信 12.0 微信12.0
当变量名称容易和紧跟其后的字段名称相混淆时,需要添加大括号“{ }” 将其括起来,否则将无法确定正确的变量名称。
对于未定义的变量,将显示为空值。
#!/bin/bash #定义变量 product=微信 version=12.0 echo ${product} 33333 ${version} #在product后面拼接了33333
[root@master myshells]# ./sec 微信 33333 12.0
在等号“ = ”后边直接指定变量内容为变量赋值的基本方法,除此之外,还有些特殊的赋值操作。
双引号主要起界定字符串的作用,特别是当赋值的内容中包含空格时,必须以双引号括起来;其他情况,双引号可以省略。
例如:若要将 weixin 5.0 赋值给变量weixin 则要值用双引号括起来。
[root@master myshells]# weinxin=weinxin 5.0 # 错误i的赋值 -bash: 5.0: command not found
[root@master myshells]# echo $weinxin #正确的赋值 weinxin 5.0
在双引号范围内,使用“$”符号可以引用其他的变量值,从而能够直接调用现有变量的值来赋给新的变量。
例如:
[root@master myshells]# version=8.0 [root@master myshells]# QQ="QQ$version" [root@master myshells]# echo $QQ QQ8.0
当要赋值内容包含 “ $ ”,“ “ ”,” ** “ 特殊的转义含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他的变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号时,需使用” ** “符号进行转义,以免冲突。
[root@master myshells]# QQ='QQ$version' #$符号不能在引用变量 [root@master myshells]# echo $QQ #输出原来的字符串 QQ$version
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围必须时能够执行的命令行,否则将会出错。
read命令是Bash的内置命令,可以给变量赋值。
read命令还可以用来提示用户提示信息,从而实现简单的交互过程。
read命令还可以结合 "-p"选项设置相应的提示信息。
[root@master myshells]# read -p "请指定备份目录:" tofile 请指定备份目录:/opt/module [root@master myshells]# echo $tofile /opt/module
Shell变量的数值运算多用于脚本程序的过程控制(循环次数,等)。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。
整数值的运算主要通过内部命令expr进行,(expr)是表达式的意思。
基本格式:
expr 变量1 运算符 变量2 【运算符 变量3】·····
其中,变量1、变量2 … 对应为需要计算的数字变量(需要以” $ “符号调用。
使用方法与大部分高级语言相似
注意:
乘法: *
不等于:! = #有空格
条件表达式:? : #有空格
[root@master myshells]# x=35 [root@master myshells]# y=35 [root@master myshells]# expr $x + $y 70 [root@master myshells]# expr $x \* $y 1225
为了在使用Shell脚本程序时,方便通过命令行为为程序提供操作参数。引出位置变量。
当执行命令行操作时,第一个字段表示命令名或者脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、…$9表示。
语法格式:
if 条件 then 命令序列 fi
单分支if语句的执行流程:首先判断条件的结果,如果返回值为0表示条件成立,则执行then后面的命令序列,一直遇到fi结束判断为止,继续执行其他脚本代码。如果返回值不为0,则忽略then后面的命令序列,直接跳至fi行以后执行。
双分支if语法格式
if 条件判断 then 命令序列 else 命令序列2 fi
if 条件 then 命令序列1 elif 条件 then 命令序列2 else 命令序列3 fi