Shell脚本应用(一)
[重点]
ØShell变量的应用
ØShell脚本的编写和执行
1.1Shell脚本的基础:
Shell是一种特殊的应用程序,介于操作系统内核与用户之间,充当一个“命令解释器”的角色
Shell作用:负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果
1.1.1Shell脚本:将平时使用的各种linux命令按顺序保存到一个文本文件,然后添加执行权限,这文件便成为一个shell脚本
lShell脚本的内容构成:环境声明、注释文字、执行语句
通过/etc/shells可以了解当前系统所支持的shell种类
/bin/bash是目前linux脚本采用的默认shell
1.1.2重定向与管道符操作
Linux系统使用文件来描述各种硬件、设备资源,如(光盘、硬盘和分区等)
交互式硬件设备:
l标准输入:默认设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
l标准输出:默认设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件
l标准错误: 默认设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件
1)重定向输出:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。使用>或>>操作符号,分别表示覆盖或追加文件
覆盖:覆盖原有文件追加:保留目标文件原有内容
列:uname �Cp > kernel.txt //将当前主机的CPU类型保存到kernel.txt文件中
Cat /kernel.txt
2)重定向输入:将命令中接收输入的途径有默认的键盘改为指定文件,而不是等待从键盘输入。使用<操作符
(结合passwd命令的“- -stdin”选项来识别标准输入)
列:vi pass.txt
123456
Passwd - -stdin jerry < pass.txt
3)错误重定向:将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定文件,而不是直接显示在屏幕上。使用2>操作符
(其中“2”是错误文件的编号。在使用标准输入、输出时,实际上省略了0、1编号)
对于shell脚本来说,可以将无关紧要的错误信息重定向到空文件/dev/null中
“2>>”追加错误信息
“&>”将两类输出信息保存到同一个文件
列:tar jcf/nonedir/etc.tgz /etc/ 2> error.log
Caterror.log
管道操作:位于管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象)。同一行命令中可以使用多个管道符。它为不同命令之间协同工作提供了一种机制
在shell脚本应用中,管道符通常用来过滤所需要的关键信息
(awk 命令做进一步过滤�CF 部分用来指定分割符号,未指定时,默认以空格或制表符分隔)
列:grep “/bin/bash$” /etc/passwd //提取前
grep “/bin/bash$/ “ /etc/passwd/ | awk �CF : ‘{print $1,$7}’ //提取后只输入用户名和登陆shell列
列:df -hT
df -hT |grep “/$” | awk ‘{print $5}’ // 提取/分区的磁盘使用率
1.2 使用shell变量
Shell变量用来存放系统和用户需要使用的特定参数(值)
1.2.1自定义变量:有系统用户自己定义的变量,又称为本地变量
1.定义新变量基本格式:“变量名=变量值”,等号两边没有空格
注意:变量名称需要以字母或下划线开头,不要包含特殊字符(如+-*/..?%#等)
列:product=benet
version=4.0
2.查看和应用变量的值:通常在变量名称前添加$,可以引用一个变量的值
使用echo可以查看变量
列:echo $product
3.变量赋值的特殊操作:在“=”两边直接指定变量内容是为变量赋值的最基本的方法
Ø双引号”:主要起到界定字符的作用。(特别是当要赋值的内容中包含空格时,必须以双引号括起来,其他情况双引号可省略)
u注:在双引号范围内,使用 $符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋值给新的变量
u列:benet=“benet 4.0”
Ø单引号’:赋值的内容中包含$ “ \等具有特殊含义的字符时,应使用单引号括起来
u注:在单引号的范围内,将无法引用其他变流量的值,任何字符将视为普通字符
u当赋值内容包含单引号时,需使用“\’”进行转义,以免冲突
u列:ACCP= ‘ACCP$version’
Ø反撇号(`): 主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量
u注:反撇号括起来的范围内必须是能够执行的命令
u列:ls -lh `which cd`
u注意:反撇号难以在一行命令中实现嵌套命令替换操作,可以使用 $()来代替反撇号操作,已解决嵌套问题
u列:rpm �Cqc$(rpm �Cqf $(which useradd))
Ø(4)read命令:给变量赋值,用来提示用户输入信息。结合“-p”选项设置提示信息,以便告知用户输入什么内容等相关信息。
列: read �Cp “请指定备份存放目录:” todir2
Echo $todir2
4.设置变量的作用范围
默认情况,新定义的变量只在当前shell环境有效,因此称为“局部变量”,当进入子程序或新的子shell环境时,局部变量将无法使用
Export命令将指定的变量导出为“全局变量”,可以同时指定多个变量名作为参数(不许使用$符号)
列: echo “$product $version” //查看当前定义的变量值
Export product version //设为全局变量
Bash // 进入子shell环境
Exit //返回原有shell环境
使用export导出全局变量,也可为变量进行赋值(这样新定义的全局变量就不用提前赋值)
列:export FQDN=www.jb-aptech.com.cn
Echo$FQDN
5.数值变量的运算
Shell变量的数值运算多用于脚本程序的过程控制(如需换次数、使用量的比较等)
在bash环境中,只能进行简单的整数运算,不支持小数运算
整数值运算主要通过内部命令expr进行,注意:运算符与变量之间必须有至少一个空格
基本格式:expr 变量 1 运算符变量2【运算符变量3】
常用的几种运算符:
l+:加法运算
l-: 减法运算
l\*: 乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符
l/: 除法运算
l%: 求模运算,又称为取余运算,用来计算数值相除后的余数
1.2.2特殊的shell变量
1.环境变量:指的是出于运行需要而由linux系统提前创建的一类变量。主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登陆终端等
环境变量的值有linux系统自行维护,会随着用户状态的改变而改变。
Env命令可以查看到当前工作环境下的环境变量
常见的环境变量及其用途:
lUSER:表示用户名称
lLANG:表示语言和字符集
lHOME:表示用户的宿主目录
lPWD:表示当前所在的工作目录
lPATH:表示命令搜索路径
注:PATH变量用于设置可执行程序的默认搜索路径
列:PATH=”$PATH:/root” //将 / root添加到搜索路径
在linux系统中,环境变量的全局配置文件为/etc/ profile,在文件定义的变量作用于所有用户
除此以外,每个用户还有自己的独立配置文件(~/.bash_profile)
若要长期变更或设置某个环境变量,应在上述文件中设置。
列:vi /root/.bash_profile
Export HIATORY=200 //将历时命令条数改为200(默认为1000条)
History | wc �Cl
2.位置变量:也称位置参数,使用$1、$2、$3…..$9表示。
列入:当执行命令“ls -lh /boot/”第1个位置变量为“-lh”,以$1表示,第2个位置变量为“/ boot”以$2表示,命令或脚本本身的名称使用$0表示
注意:虽然$0与位置变量的格式相同,但$0属于预定义变量而不是位置变量
3.预定义变量:由bash程序预先定义好的一类特殊变量,(用户只能使用预定义变量,但不能创建新的预定义变量,也不能直接为预定义变量赋值)
预定义变量使用:$符号和另一个符号组合表示
常用的几个预定义变量:
l$#:表示命令行中位置参数的个数
l$*:表示所有的位置参数的内容
l$?:表示前一条命令执行后的返回状态
l$0:表示当前执行的脚本或程序名称
列:vi mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tar.tgz
Tar zcvf $TARFILE $* &> /dev/null
Echo “ 已经执行 $0脚本”
Echo “ 共完成 $# 个对象的备份”
Echo “ 具体内容包括: $*”
#chmod +x mybak.sh
#./mybak.sh /boot/grub //备份1个对象的情况
#./mybak.sh /etc/passwd /etc/shadow //备份2个对象的情况
Ls �Clh beifen-* // 确认备份结果
本文出自 “敏而好学” 博客,谢绝转载!