1.概念
所谓shell script (即shell脚本),就是将一些有逻辑关系的命令按照一定格式写在一个文本中,执行这个文本相当于执行文本中的所有命令。它可以一次性执行一批文件,类似于Windows/Dos下的批处理功能,方便了管理员进行的设置和管理,从而工作效率得到提高。
2.脚本的格式
脚本文件的扩展名一般为sh(代表shell),如test.sh。但是扩展名并不影响程序的执行,扩展名不为sh,但具有可执行权限的文件亦可以执行,但为了标准化和方便管理,一般shell脚本文件文件名都以.sh结尾。
脚本文件第一行一般写 #!/bin/bash ,其中#!为一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。linux中的shell解释器还有sh,csh,它们都存放在/bin目录中。其实脚本第一行不指定解释器默认为bash,若#!后面指定的不是系统解释器,这样的话就要在执行命令的时候在脚本文件的绝对路径前指定。例如:
3.脚本中常用的参数,符号
(1)变量
环境变量:只用在该shell环境中,退出该shell重新打开进入则已变量不存在
用户变量:只用在某一特定用户中,一般声明在.bashrc文件中(从用户家目录进入)
系统变量:适用于该系统各种环境,一般声明在/etc/bashrc文件中
(2)算术运算符
++(加1) , --(减1) , + , - , * , / , %(取余) , **(幂运算) , +=(加等) , -=(减等) 。
用$[ ]表示数学运算
(3)位置参数
指定的位置参数总数:$# 位置参数自身:$0、$1、$2、$3.... 所有位置参数: $@、$*
(4)退出状态
0 – 在指定的文件中找到了模式 1 – 在指定的文件中未找到模式 >1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
退出状态存在“?”中,可用命令:echo $? 查看
(5)比较运算符
字符串比较运算符:=、!=
数字比较运算符:-eq(等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)
4.一些简单的示例(做实验脚本写在/mnt目录中)
(1)简单的输出实验
**注意**:脚本文件要给可执行权限,否则不能执行;执行命令时要给脚本文件的绝对路径,否则不能执行
(2)将/etc下以.conf结尾的文件备份到/mnt/etconfig/中,并在备份文件夹名后加上时间戳,格式为:年-月-日-秒
(3)实现一个1分10秒的倒计时
**脚本调试:显示脚本每一步执行的命令以及执行完的输出结果,可在命令中脚本文件的绝对路径前加sh -x
(4)将数据库中有用的库备份
首先下载数据库相关服务软件:yum groups install mariadb,打开服务,创建两个数据库(westos和redhat),内建linux表,随意写入数据备用。然后编写如下脚本:
(5)根据用户给出的网卡给出相应IP地址(提示列出用户要输入的网卡)
(6)如果命令后面没加IP,提示用户加上IP,如果加了,就PING这个IP,并将PING的结果告诉用户(PING通或没PING通)
(7)编写一个脚本script.sh,实现如下要求:
script.sh /mnt/userfile /passfile,以userfile中的字符串为用户名,passfile中的字符串为密码建立用户
要建立的用户存在时,不做任何处理
脚本后文件个数少于两个时,提示please give me userfile or passfile
当所给文件行数不一致时提示userfile's line is different from passfile's line
脚本:
运行成功后:
文件行数不相等时:
指定文件个数小于两个时:
(8)写一个脚本ctrl_user.sh,运行时在脚本后加参数实现对用户的控制:
不加参数或参数数量不够时时,提示用户,加上参数create或delete,及用户名文件userfile
加create参数时,如果userfile中的用户存在,则提示用户该用户已存在,否则创建该用户并设密码为westos
加delete参数时,如果userfile中的用户不存在,则提示用户该用户不存在,否则删除该用户
脚本如下:
[root@desktop5 mnt]# vim ctrl_user.sh #!/bin/bash while [ "$#" -lt "2" ] do echo "Give me a parameter like :create,delete,and a userfile! " exit 1 done if [ "$1" = "create" ] then for USER in `cat $2` do NAME=`getent passwd $USER` if [ -z "$NAME" ] then useradd $USER echo westos | passwd --stdin $USER else echo "The user $USER is exist!" fi done fi if [ "$1" = "delete" ] then for USER in `cat $2` do NAME=`getent passwd $USER` if [ -n "$NAME" ] then userdel -r $USER &>/dev/null else echo "The user $USER is nor exist!" fi done fi