分享

shell编程规范及变量

 夜猫速读 2022-05-16

一、编写脚本的基本流程;

二、脚本的基础知识;

三、脚本中变量的应用;

一、编写脚本的基本流程;

1.shell脚本语言:帮助管理员实现批量化完成任务,结合计划任务实现自动化运维;

2.编写脚本的流程:

  a.创建目录,集中存放脚本文件;

  b.编写脚本内容;

         vi 脚本名.sh                ##编辑脚本文件

          #!/bin/bash                ##声明解释器

          #注释内容                ##可以注释些信息,方便后续查看

          命令及控制语句                ##脚本的核心内容

        :wq                        ##保存文件

  c.赋予脚本文件执行权限:chmod +x 文件

  d.运行脚本;

3.脚本的声明:声明使用哪种解释器,cat /etc/shells文件中的所有解释器都可以使用,解释器可安装;

4.执行脚本的方式:

  a.路径执行(必须有执行权限);

        相对路径

         绝对路径

  b.source 脚本的绝对路径或相对路径(不需要执行权限);

  c.sh -x 脚本的路径(不需要执行权限),并且会显示命令和输出结果;

二、脚本的基础知识;

1. 重定向:改变了标准的输入输出状态;

  >:重定向输出到某个位置,替换原有文件的所有内容;

  >>:重定向追加输出到某个位置,在原有文件的末尾添加内容;

  <:重定向输入某个位置的文件;

  2>:重定向错误输出;

  2>>:重定向错误追加输出到文件的末尾;

  &>:混合重定向输出,正确错误的输出结果都会输出;

  1,2>:同上;

2.管道符:将|前的命令的输出结果作为管道|后的命令的输入;

3.echo命令:返回结果并显示;

  语法:echo [选项] "需要返回的值"

  选项: 选项-e 若出现特殊字符则不将其转义,当普通字符对待;

            在返回值中\n 代表强制换行、\t代表制表符;

  内容中的选项:"内容\t内容"                插入tab

                          "内容\n内容"                强制换行

三、脚本中的变量的应用;

1.概述:变量是一个筐,筐里装的是变量的值,只需要将筐带走,那么值也就随之带走,值为可变;

2.优点:简化输入,使脚本内容更加清晰,提高脚本的适用性;

3.分类:自定义变量、环境变量、位置变量、预定义变量;

4.自定义变量的定义:

  a.定义变量:变量名=变量值

  b.查看变量:echo $变量名

  c.使用变量:在命令中直接使用 $变量名

  d.取消变量:unset 变量名

  e.变量的作用范围:

          局部变量:变量名=变量值,此种变量只能在当前bash中有效;

        全局变量:export 变量名=变量值,此种变量在当前bash和当前子bash中有效;

        注:可用 bash命令开启当前进程的子进程bash,exit退回到父bash进程;

  f.变量值中使用的括号:

     "":弱引用,会将双引号内的特殊符号与命令一起执行,例:A="ls -ld"

         '':强引用,会将单引号内的$、"、\等特殊符号失效,例:B="$A /etc/ ",B='$A /etc/'

        ``:在定义变量时,引用命令,在值中引用变量等同于$(),''不可嵌套,$()可以嵌套;例:A=`du -sh /etc/`

        $():在定义变量时,引用命令,可以嵌套;例:AC=$(rpm -qf $(which rz))

        注:当变量值中包含'单引号时,应使用\'将单引号进行转义;

  g.变量名不能使用特殊符号,一般用大写字母和下划线;

  h.交互定义变量:

        read -p "提示文字信息" 变量的名称

        提示文字信息:123

        echo $变量名

         123

5.环境变量的定义:

  a.环境变量设置用户工作环境,名称不能修改,值可以修改;

  b.环境变量的常用:

        PATH=设置外部命令的存放的路径,用冒号隔开

        TMOUT=设置登录超时,单位为秒

        HISTSIZE=设置历史命令记录的条数

        LANG=设置语言环境(vi /etc/sysconfig/i18n  进行永久修改字符集)

        注:设置临时环境变量时(注销就失效了):export PATH=

  c.环境变量的查看:env命令查看当前工作环境的所有环境变量;

                                /etc/profile文件为用户每次登陆执行的的配置文件;

                                每个用户家目录中的.bash_profile是每个用户独立的环境变量配置文件;

6.位置变量和预定义变量:

  a.位置变量用于将脚本参数传递给脚本,有$1-$9,除命令或脚本本身外的所有;

  b.预定义变量:用户只能使用,不能创建,不能直接赋值;

          $0:为脚本本身或命令本身

        $*:为脚本后的所有参数

        $#:脚本参数数量统计

        $?:上一条命令是否执行成功,返回值为0则成功,否则失败

注:在shell脚本中,所有的路径必须为绝对路径;

编写脚本:

使用母盘克隆一个虚拟机,并命名为shell脚本测试机。

一.练习脚本的基本编写流程:

1.确定任务及完成任务的命令

2.编写脚本整合任务

3.授权并测试执行

[root@www ~]# mkdir -p /root/bin

[root@www ~]# cd /root/bin

[root@www bin]# vi sysinfo.sh 

#!/bin/bash    ##从/etc/shells中选择一个shell解析下面的内容

#by linuxfan

#20160614

#system info.

#我的第一个脚本,这是一个注释

#查看网络相关信息

ip a

hostname

cat /etc/hosts

cat /etc/resolv.conf

ip r

#查看设备包括内存、cpu、磁盘等使用情况

cat /proc/cpuinfo

lscpu

cat /proc/meminfo |grep -i total

free 

cat /proc/partitions

df -hT

##查看进程和服务情况

ps aux |wc -l

service --status-all

chkconfig --list |grep 3:on

:wq

[root@www bin]# chmod +x sysinfo.sh   ##授权

[root@www bin]# /root/bin/sysinfo.sh   ##路径执行

[root@www bin]# sh -x sysinfo.sh  ##测试时常用不需要执行权限

[root@www tmp]# source sysinfo.sh  ##一般用于让配置文件生效等,不需要执行权限

二.变量及管道的使用:

1.使用变量,编写安装apache的脚本:

[root@www bin]# vim install_httpd.sh 

#!/bin/bash

#by fage 2016-01-14

#install apache httpd!

#############download httpd#####

HV=httpd-2.2.17

wget ftp://ftp.linuxfan.cn/tools/$HV.tar.gz -P /root

##########解压缩,并安装#############

tar zxvf /root/$HV.tar.gz -C /usr/src/ >/dev/null

cd /usr/src/$HV/

./configure --prefix=/usr/local/httpd --enable-so --enable-cgi --enable-rewrite --enable-ssl&&make &&make install &>/dev/null

:wq

以此类推,编写安装mysql及php的脚本

chmod +x install_httpd.sh

/root/bin/install_httpd.sh   ##执行脚本并安装

ls /usr/local/httpd

2.练习重定向和管道:

[root@www bin]#ip a |grep eth0 |grep inet |awk {'print $2'} |awk -F '/' {'print $1'}

[root@www bin]# vim  hosts.sh 

#!/bin/bash

#2016-01-14 by linuxfan

##设置hosts解析,为www.linuxfan.cn

IP=$(ip a |grep eth0 |grep inet |awk {'print $2'} |awk -F '/' {'print $1'})

read -p "input FQDN:" NANE

echo "$IP $NANE"  >>/etc/hosts

:wq

[root@www bin]#sh -x hosts.sh

[root@www bin]#cat /etc/hosts

特殊变量及脚本的综合应用

一.环境变量:

[root@ns ~]# env  ##查看所有的环境变量

[root@ns ~]# echo -e "1\n2"  ##换行显示

[root@ns ~]# echo -e "1\t2"  ##在1和2之间加入tab显示

[root@ns ~]# echo -e "$PATH\n $SHELL\n $HOSTNAME\n $MAIL\n $HISTSIZE\n\t $LANG"

注意:PATH为命令搜索路径,SHELL为当前用户使用的shell,HISTSIZE为历史命令记录条数,LANG当前使用的语言

[root@ns ~]# export  ##查看全局环境变量定义情况

[root@ns ~]# export.UTF-8  ##设置语言,如果需要设置为中文将值改为zh_CN.UTF-8

[root@ns ~]# locale  ##查看语言设置

[root@ns ~]# unset HISTSIZE  ##取消环境变量HISTSIZE

[root@ns ~]# vim /etc/DIR_COLORS  ##修改第81,128行的值如下

81  DIR 01;43 

128 .xz  01;32

:wq

[root@ns ~]# tar Jcf changecls.xz /etc/hosts ; mkdir dir  ##创建测试文件和目录  

[root@ns ~]# exit  ##注销系统,重新登录验证

[root@ns ~]# ls  ##颜色已经变了

[root@ns ~]# echo "export TMOUT=300" >>/etc/profile  ##设置登陆超时TMOUT为永久生效的环境变量,注意只有写入了文件的变量才是永久生效的

[root@ns ~]# source /etc/profile

[root@ns ~]# sed -i 's/HISTSIZE=100/HISTSIZE=800/g' /etc/profile  ##设置历史命令条数

[root@ns ~]# grep HIST /etc/profile |grep ^HI  ##验证

[root@ns ~]# source /etc/profile

[root@ns ~]# echo $HISTSIZE

总结:环境变量是为用户设置的工作环境参数的变量,修改时先测试,再写入文件。

二:位置变量和预定义变量:

[root@ns bin]# vim position.sh ##编写并理解位置变量和预定义变量

#!/bin/bash

echo "This is \$0:$0"

echo "This is \$1:$1"

echo "This is \$2:$2"

echo "This is \$3:$3"

echo "This is \$4:$4"

echo "This is \$5:$5"

echo "This is \$6:$6"

echo "This is \$7:$7"

echo "This is \$8:$8"

echo "This is \$9:$9"

echo "This is \$#:$#"

echo "This is \$*:$*"

echo "This is \$?:$?"

echo "$0 is exec complete! "

:wq

[root@ns bin]# chmod +x position.sh

[root@ns bin]# /root/bin/position.sh  a b c d e f g h x y z 

[root@ns bin]# vim bak.sh 

#!/bin/bash

TF="/opt/benfen-$(date +%F).tar.gz"

tar zcf $TF $* 1>/dev/null

echo "\$0:exec $0 script."

echo "\$#:total bakup $#."

echo "\$*:bakup $*"

echo "30 12 * * 7 /root/bin/bak.sh $*" >>/var/spool/cron/root

:wq

[root@ns bin]# chmod +x bak.sh

[root@ns bin]# /root/bin/bak.sh  /etc/yum.repos.d/ /etc/sysconfig  /etc/hosts  ##备份,并观察$0,$#,$*的作用

三.编写MySQL备份脚本:

1.准备数据库:

[root@www bin]# vim sql.sh  ##在web服务器上编写该脚本,

#!/bin/bash

## by linuxfan.cn 2016.1.1

mysql -uroot -p123123 <<END

create database studydb;

create database coursedb;

grant select,lock tables on studydb.* to operator@'192.168.100.151' identified by '123123';

grant select,lock tables on coursedb.* to operator@'192.168.100.151' identified by '123123'

show grants for operator@'192.168.100.151';

END

:wq

请完成下列操作后再执行脚本:

netstat -utpln |grep 3306  ##确认数据开启

mysql -uroot -p123123  ##能登录数据库

chmod +x sql.sh  ##授权

在上述脚本中使用变量,将可能随着主机的IP,数据库名称,密码,用户名设置为变量后并替换掉相应的位置。

2.编写备份数据的脚本:

在ca服务器上完成:

[root@ca ~]# mkdir bin

[root@ca ~]# cd bin/

[root@ca bin]# vim dbbak.sh

#!/bin/bash

## by linuxfan.cn

## 2016.1.1

mkdir /opt/dbbak/

/usr/bin/mysqldump -uoperator -p123123 -h 192.168.100.150 --databases coursedb >/opt/dbbak/coursedb-$(date +%F-%H:%M).sql >/dev/null

/usr/bin/mysqldump -uoperator -p123123 -h 192.168.100.150 --databases studydb >/opt/dbbak/studydb-$(date +%F-%H:%M).sql >/dev/null

/bin/tar Jcf /opt/dbbak/coursedb-$(date +%F-%H:%M).tar.xz /opt/dbbak/coursedb-$(date +%F-%H:%M).sql --remove &>/dev/null

/bin/tar Jcf /opt/dbbak/studydb-$(date +%F-%H:%M).tar.xz /opt/dbbak/studydb-$(date +%F-%H:%M).sql --remove &>/dev/null

:wq

请完成下列操作后再执行脚本:

mount /dev/cdrom /mnt

yum -y install mysql  ##安装mysql客户端

mysql -uoperator -p123123 -h 192.168.100.150  ##登录测试

mysqldump -uoperator -p123123 -h 192.168.100.150 --databases studydb >test.sql;ls ##查看是否能成功备份

在上述脚本中使用变量,将用户,数据库名称,密码,主机IP,时间,备份后的sql文件名称,压缩文件的名称定义成变量,并替换相应的位置。

chmod +x dbbak.sh

脚本测试:

sh -x dbbak.sh

ls /opt/dbbak/  ##查看是否只有xz后缀的文件

测试成功后添加计划任务:

echo "30 2 * * *  /root/bin/dbbak.sh"  >>/var/spool/cron/root

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多