【shell 脚本应用】

目录

shell脚本应用基本介绍

一、shell脚本

1、shell脚本的作用shell解释器的作用

2、脚本的基本结构和执行长见的方式

3、管道符和重定型基本输入输出

二、环境变量的基本使用

1、变量的类型

2、配置自定义变量

3、变量常见赋值的符号

4、整数变量运算符

5、特殊变量

Shell脚本应用基本操作 

一、条件测试

1、test判断

2、比较运算符

3、字符串比较

4、逻辑测试

二、if判断

1、if判断的类型

2、单分支if判断

3、双分支判断

4、多分支if判断

shell脚本的应用

一、循环的基本使用

1、for循环

2、while随机循环

二 case控制服务的基本应用

1、case的语法格式

2、使用case写一个控制vsftpd服务脚本


shell脚本应用基本介绍


一、shell脚本

1、shell脚本的作用shell解释器的作用

1)shell脚本的作用

自动化运维使用

批量化重复操作使用脚本代替

2)shell解释器的作用

Linux系统默认使用的bash命令解释器

负责接收用户输入的命令提交CPU判断执行

2、脚本的基本结构和执行长见的方式

1)脚本的结构

[root@centos01 ~]# vim test.sh

脚本后缀文件*.sh

#!/bin/bash

声明

#E-mail:[email protected]

脚本的描述和写脚本的联系方式

脚本执行的命令

2)运行脚本的方式

[root@centos01 ~]# sh test.sh

使用sh命令运行

[root@centos01 ~]#  ./test.sh

在当前位置运行脚本

[root@centos01 ~]# source ./test.sh

source命令运行脚本

3、管道符和重定型基本输入输出

1)基本的输入输出

标准的输入:接收或者读取用户输入的数据<

标准的输出:将数据显示在屏幕或者文件中>,追加>>

错误输出:错误输出可以显示在屏幕或者特定文件中,2>错误输出

混合输出:不管是正确或者错误都输出到文件中,&>

2)管道符|

把前一个命令执行的结果,变成后一个命令处理的对象

二、环境变量的基本使用

1、变量的类型

1)自定义变量

管理员手动创建,根据需要自己定义

2)环境变量

维护系统使用

不需要管理员创建系统自动创建

3)位置变量

命令行给脚本传递程序参数使用

4)预定义变量

bash预定义好的特殊变量

用户不能修改

2、配置自定义变量

1)创建变量,变量名字是a变量值为10

[root@centos01 ~]# a=10

2)查看变量值两种方法

[root@centos01 ~]# echo $a

[root@centos01 ~]# expr $a

3、变量常见赋值的符号

1)双引号,允许通过$符号引用其他变量值

[root@centos01 ~]# test="$ab $bb"

[root@centos01 ~]# echo $test

benet 6.0

2)单引号,禁止引其他变量值

[root@centos01 ~]# test='$ab $bb'

[root@centos01 ~]# echo $test

$ab $bb

3)反撇,命令替换提取命令执行的结果

[root@centos01 ~]# aa=`netstat -anptu | grep 22`

[root@centos01 ~]# echo $aa

4)read将输入的内容赋值给特定的变量名

[root@centos01 ~]# read -p "请输入特定的目录:" insert

请输入特定的目录:/boot

[root@centos01 ~]# echo $insert

/boot

5)定义全局环境变量子shell可以应用

[root@centos01 ~]# export a=100

[root@centos01 ~]# echo $a

4、整数变量运算符

1)创建的运算符

+:加法

-:减法

\*:乘法

/:除法

%:求模(余)运算

2)运算基本的应用

[root@centos01 ~]# a=100

[root@centos01 ~]# b=200

[root@centos01 ~]# expr $a + $b

300

[root@centos01 ~]#expr 1 + 1

[root@centos01 ~]#echo  $[1+1]

[root@centos01 ~]#echo “scale=2;1.25*1.25”|bc

[root@centos01 ~]#free

[root@centos01 ~]#vim mom.sh

#!/bin/bash

mt=$(free | awk 'NR==2{print $2}')

mu=$(free | awk 'NR==2{print $3}')

muu=$(expr $mu \* 100 / $mt)

echo $muu

或者

echo "scale=2; $mu/$mt*100" |bc

[root@centos ~]# free  |  awk  'NR==2{print  int($3/$2*100)"%"}'

3)花括号的用于区分符号

[root@centos01 ~]# echo ${ab}0.10.1

benet0.10.1

5、特殊变量

1)环境变量

系统创建

2)位置变量

提供9个位置$n(n代表1--9)

3)预定义变量

$#:命令行中位置参数

$*:所有位置参数

$?:记录的脚本执行状态0表示成功,非0表示错误

$0:执行脚本的进程程序名字

[root@centos ~]# vim bak.sh

#!/bin/bash



mkdir /backup

tar zcf /backup/file_all-$(date +%F).tar.gz $* &>/dev/null

echo "共备份了$#个文件"

echo "成功执行了$0脚本"

echo "备份的文件为:$*"

或者

[ $? -eq 0] && echo "成功执行了$0脚本"

[root@centos ~]# chmod +x bak.sh

[root@centos ~]# ./bak.sh  /etc/passwd  /etc/group

 清除重建缓存

 yum clean all && yum makecache fast

挂载光盘

#!/bin/bash

#用户自动构建yum仓库脚本



#挂载光盘

mount /dev/cdrom /mnt

#创建仓库文件

cd  /etc/yum.repos.d/

mkdir bak

mv *.repo bak

#创建yum文件

echo “[yum]

name=yum

baseurl=file:///mnt

enabled=1

gpgcheck=0” > local.repo

#  清除重建缓存

 yum clean all && yum makecache fast

批量处理统一文件内容---非交互

vi pass.txt



123456

#useradd user1

#passwd  --stdin  user1 < pass.txt

或者

#echo  “123456” | passwd  --stdin  user1

&> 或者2>&1, &>有些语法不支持

vim /etc/init.d/network

挂载光盘提示信息重定向到黑洞

#!/bin/bash

#用户自动构建yum仓库脚本



echo  “挂载光盘…..”

mount /dev/cdrom /mnt  &> /dev/null

echo “创建仓库文件…..”

cd  /etc/yum.repos.d/

mkdir bak

mv *.repo bak

#创建yun文件

echo “[yum]

name=yum

baseurl=file:///mnt

enabled=1

gpgcheck=0” > local.repo

echo  “清除重建缓存…..”

 yum clean all    &> /dev/null  && yum makecache fast   &> /dev/null

echo  “yum创建成功….”

#cd  /boot | ls –l

#cd  /boot ;  ls –l

#ls /etc  | wc -l

#find ./ -name “*.sh”| xargs  ls  -l   xargs强制接收

#cat 123

11  22  33

aa  bb  cc

#awk  {print  $2}’first.sh

#awk  {print $2}’123

#awk  {print $2,$1,$3}’123

#df

#df  |grep  “/$”| awk ‘{print  $5}’

#df  |grep  “/$”| awk ‘{print  $5}’| awk –F ‘%’ ’{print $1}’

或者

# df  | awk  –F’[   %]+’ ’/\/$/{print $(NF-1)}’

#x=18

#expr  3 + $x

变量

#!/bin/bash

#用户自动构建yum仓库脚本



x=”/mnt”



echo  “挂载光盘…..”

mount /dev/cdrom  $x &> /dev/null

echo “创建仓库文件…..”

cd  /etc/yum.repos.d/

mkdir bak

mv *.repo bak

#创建yun文件

echo “[yum]

name=yum

baseurl=file://$x

enabled=1

gpgcheck=0” > local.repo

echo  “清除重建缓存…..”

 yum clean all    &> /dev/null  && yum makecache fast   &> /dev/null

echo  “yum创建成功….”

rpm –qi $(rpm –qf $(which mkdir))

变量输出

#name=zhangsan

#echo $name

#echo ${name}

#echo $namenihao

#echo ${name}nihao

read  -p “请输入你的名字” name

echo  $name

变量

#!/bin/bash

#用户自动构建yum仓库脚本

read  -p “输入你的挂载点位置:” x



echo  “挂载光盘…..”

mkdir $x

mount /dev/cdrom  $x &> /dev/null

echo “创建仓库文件…..”

cd  /etc/yum.repos.d/

mkdir bak

mv *.repo bak

#创建yun文件

echo “[yum]

name=yum

baseurl=file://$x

enabled=1

gpgcheck=0” > local.repo

echo  “清除重建缓存…..”

 yum clean all    &> /dev/null  && yum makecache fast   &> /dev/null

echo  “yum创建成功….”

交互界面

 #!/bin/bash

echo “centos….

kernel….”

read –p “localhost login:”user

if [  $user   = “root”]

then

echo “欢迎登陆”

else

       echo “拜拜”

fi

Shell脚本应用基本操作 


一、条件测试

1、test判断

1)判断结果类型

2)判断语法

[root@centos01 ~]# test -d /boot && echo "YES"

测试boot是目录显示YES

[root@centos01 ~]# [ -d /boot ] && echo "yes"

测试boot是目录显示YES

3)常见的测试选项

-d测试目录

-f测试文件

-w测试写权限

-r测试读权限

-x测试执行权限

-e测试文件目录是否存在

[root@centos ~]# vim cd.sh

#!/bin/bash

[ -d /cd ] || mkdir /cd

[ -d /cd/Packages ] || mount /dev/cdrom /cd &> /dev/null

2、比较运算符

1)常见的比较运算符

gt大于

lt小于

ge大于等于

le小于等于

eq等于

ne不等于

[root@centos ~]# vim num.sh

#!/bin/bash

read -p "请输入一个数字:" num

[ $(expr $num % 2) -eq 0 ] && echo "$num 是偶数" || echo "$num 是基数"

[root@centos ~]# sh num.sh

请输入一个数字:123

123 是基数

2)比较运算符的基本使用

[root@centos01 ~]# [ 10 -gt 5 ] && echo "YES"

10大于5显示为yes

[root@centos01 ~]# abc=`history | wc -l`

[root@centos01 ~]# [ $abc -gt 100 ] && echo "yes"

提取history命令行数,和100比较大于100显示yes

3、字符串比较

1)字符串比较运算符

=:字符串内容是否相同

!=:字符串内容是否不同

-z:检查字符串是否为空

2)字符串比较的应用,字符串需要使用双引号

[root@centos01 ~]# [ "aaa" = "aaa" ] && echo "yes"

判断aaa字符全是否等于aaa字符

[root@centos01 ~]# [ $LANG != "en.US" ] &&  echo "不支持中文!!"

LANG变量不等于en.US显示不支持中文

4、逻辑测试

1)逻辑测试的常见运算符

&&:而且或者用-a表示,两个结果为真显示

||:或,或者使用-o表示,两个判断结果只需要满足一个条件显示为真

!:否,两个判断结果不成立为真

[root@centos ~]# vim cj.sh

#!/bin/bash

read -p "输入考试成绩:" num

[ $num -ge 60 -a $num -le 100 ] && echo "考试及格"  

或者

[ $num -ge 60 ] && [ $num -le 100 ] && echo "考试及格"

2)逻辑测试简单使用

[root@centos01 ~]# [ -d /etc ] && [ -d /boot ] && echo "是目录!!"

两个结果为真显示是目录

[root@centos01 ~]# [ -d /etc ] || [ -d /ssss ] && echo "是目录!!"

两个结果一个为真显示为是目录

二、if判断

1、if判断的类型

1)单分支

条件满足执行命令序列

2)双分支

条件满足执行第一个命令序列

条件不满足执行第二个命令序列

3)多分支

条件满足执行第一个命令序列

条件不满足第一个条件匹配第二个条件,执行第二个命令序列

不满足第二个条件执行最后一个条件运行默认命令序列

2、单分支if判断

1)单分if判断命令结构

if  [ 条件 ]

Then

执行命令序列

fi

2)测试目录是否存在,不存在自动创建,目录存在停止执行脚本

#!/bin/bash

mount="/mnt/test"

if [ ! -d $mount ]

then

        mkdir -p $mount

Fi

3)测试磁盘空间

[root@centos01 ~]# export aa=`df -Th | grep "/$" | awk '{print $5}' |awk –F “%” ‘{pring $1}’`

提取磁盘空间

[root@centos01 ~]# cat fdisk.sh

#!/bin/bash

if [ $aa -eq 73 ]

then

echo "磁盘已经沾满不能存储数据!!!"

fi

[root@centos01 ~]#

提取磁盘空间等于73G提醒用户不能存储数据

[root@centos ~]# vim disk.sh

#!/bin/bash

du=$(df | grep "/$" | awk '{print $5}' | awk -F'%' '{print $1}')

if [ $du -gt 3 ]

then

          echo "使用超出"

fi

3、双分支判断

1)多分支的命令结构

if  [ 条件 ]

then

执行命令序列一

else

执行命令序列二

Fi

1、httpd服务是否启动

[root@centos ~]# vim httpd.sh

#!/bin/bash

netstat -lnpt | grep -q :80

if [ $? -eq 0 ]

then

       echo "网站服务正在运行"

else

       echo "服务关闭,尝试启动"

       systemctl start httpd

fi

[root@centos ~]# bash httpd.sh

2判断bind的包是否安装

[root@centos ~]# vim bind.sh

#!/bin/bash

rpm -q bind &> /dev/null

if [ $? -eq 0 ]

then

        echo "软件包已安装"

else

        echo "软件包未安装,尝试安装"

        yum -y install bind &> /dev/null

        [ $? -eq 0 ] && echo "软件安装成功"

fi

[root@centos ~]# bash bind.sh

2)判断的主机是否通信

[root@centos01 ~]# cat ./ping.sh

#!/bin/bash

read -p "请输入指定的IP地址:" ping

ping -c 3 -i 0.2 -W 3 $ping &> /dev/null

if [ $? -eq 0 ]

then

echo "host is $ping UP!!!!"

else

echo "host is $ping DOWN!!!!"

fi

或者

[root@centos ~]# vim ping.sh

#!/bin/bash

ping -c 3 -i 0.2 -W 3 $1 &> /dev/null

if [ $? -eq 0 ]

then

        echo "host $1 is up"

else

        echo "host $1 is down"

fi

[root@centos ~]# chmod +x ping.sh

[root@centos ~]# ./ping.sh

[root@centos ~]# ./ping.sh 192.168.200.1

4、多分支if判断

1)多分支if判断语法结构

 if [条件判断]

then

执行命令序列一

elif [ 条件判断 ]

then

     执行命令序列二

else

执行命令序列三

2)编写多分支测试脚本

判断成绩是否合格正常语句—---有漏洞

#!/bin/bash

read -p "输入考试成绩范围1~100分:" test

if [ $test -ge 85 ] && [ $test -le 100 ]

then

echo "$test 分,你真棒考试优秀!!!"

elif [ $test -ge 70 ] && [ $test -le 84 ]

then

echo "$test 分,考试合格需要继续努力!!!"

else

        echo "$test 分,你需要重新学习!!!"

fi

 或者

#!/bin/bash

read -p "输入考试成绩范围1~100分:" test

if [ $test -ge 0 -a $test -le 100 ]

then

        if [ $test -ge 85 -a $test -le 100 ]

        then

                echo "$test 分,你真棒考试优秀!!!"

        elif [ $test -ge 70 -a $test -le 84 ]

        then

                echo "$test 分,考试合格需要继续努力!!!"

        else

                 echo "$test 分,你需要重新学习!!!"

        fi

else

                echo "成绩有误,无法判断"

fi

 石头剪刀布

[root@centos ~]# vim games.sh

#!/bin/bash

echo "这是(石头0 剪刀1 布2)的小游戏,放松一下:"

pc=$(expr $RANDOM % 3)

read -p "输入你的选择:" user

if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc -eq 2 -a $user -eq 1 ]

then

        echo "恭喜你赢了电脑"

elif [ $pc -eq $user ]

then

        echo "平局"

else

        echo "你输了,再来"

fi

~      

 或者

#!/bin/bash

echo "这是(石头0 剪刀1 布2)的小游戏,放松一下:"

while true

do

        pc=$(expr $RANDOM % 3)

        read -p "输入你的选择:" user

        if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc -eq 2 -a $user -eq 1 ]

        then

                echo "恭喜你赢了电脑"

        elif [ $pc -eq $user ]

        then

                echo "平局"

        else

                echo "你输了,再来"

        fi

done

shell脚本的应用


一、循环的基本使用

1、for循环

1)for循环的语法结构

for 变量名 in 取值列表

do

命令序列

done

2)for列表的定义

[root@centos01 ~]# cat username.txt

bob

tom

alice

3)创建for循环批量创建用户,设置密码为123456

#!/bin/bash

for name in $(cat user.txt)

do

        useradd $name

        echo "123456" | passwd --stdin $name

done

4)批量化删除用户

#!/bin/bash

for name in $(cat user.txt)

do

       

userdel -r $name

done

5)使用for循环ping用户要访问的主机

#!/bin/bash

for ip in $(cat p.txt)

do

        ping -c 3 -i 0.2 -W 3 $ip &> /dev/null

        if [ $? -eq 0 ]

        then

                echo "host $ip is up"

        else

                echo "host $ip is down"

        fi

done

[root@centos ~]# for i in {10..1};do echo $i;sleep 1;done

循环规则

#!/bin/bash

for i in {1..9}

do

        for j in {1..9}

        do

                echo $i $j

        done

done

乘法表

#!/bin/bash

for i in {1..9}

do

        for ((j=1;j<=$i;j++))

        do

                echo -n "${j}x${i}=$(($i*$j)) "

        done

        echo

done

2、while随机循环

1)while的命令结构

while [条件]

do

命令序列

done

2)随机创建20个账户密码设置为123456

[root@centos01 ~]# cat aaa.sh

#!/bin/bash

i=1

while [ $i -le 20 ]

do

        userdel -r stu$i

        #useradd stu$i

        #echo "123456" | passwd --stdin stu$i       

 let i++

Done

Games时间

猜数字

#!/bin/bash

echo "这是一个猜商品价格(1-1000)的小游戏,猜猜看"

pc=$(expr $RANDOM % 1000 + 1)

cs=0

while true

do

        read -p "输入你猜测的价格:" int

        let cs++

        if [ $int -gt $pc ]

        then

                echo "价格给高了"

        elif [ $int -eq $pc ]

        then

                echo "恭喜猜对了"

                echo "共猜了$cs次"

                exit

        else

                echo "价格给低了"

        fi

done

二 case控制服务的基本应用

1、case的语法格式

case 变量值 in

模式1)

;;

模式2)

;;

*)

默认命令序列

esac

2、使用case写一个控制vsftpd服务脚本

[root@centos01 ~]# cat ./vsftpd.sh

#!/bin/bash

#chkconfig:35 80 21

#Description:vsftpd Server

case "$1" in

start)

echo "正在启动vsftpd服务[确定]"

;;

stop)

echo "正在停止vsftpd服务[确定]"

;;

restart)

echo "正在重新启动vsftpd服务[确定]"

;;

*)

echo "用法:$0{start|stop|restart}"

esac

[root@centos01 ~]#

例子:

[root@centos ~]# vim /etc/init.d/file

 #!/bin/bash

case $1 in

create)

        touch /tmp/{1..100}.txt

;;

delete)

        rm -rf /tmp/{1..100}.txt

;;

list)

        ls -l /tmp/{1..100}.txt

;;

*)

        echo "用法:$0{create|delete|list}"

esac

例子

#!/bin/bash

read -p "请输入一个字符:" str

case $str in

[a-zA-Z])

        echo "字母"

;;

[0-9])

        echo "数字"

;;

*)

        echo "特殊符号"

esac

猜你喜欢

转载自blog.csdn.net/2302_77750172/article/details/131688585