shell脚本从基础到实战(全网最详细)监控、加减乘除、购票、批量创建与删除用户等脚本

在这里插入图片描述

目录
一、前言
二、使用shell回顾shell的一些功能、语句
三、shell语句
四、shell实战
五、结尾
在这里插入图片描述

一、前言

学习shell脚本上篇文章是完全不够的,首先还得先从linux最基础的命令开始学起,上一篇文章只能看懂个大概,接下来所有的shell脚本都是从linux命令的基础上来设计的、以及运行的。
因此,学习shell和学习linux命令两者缺一不可!

二、使用shell回顾shell的一些功能、语句

1、通过vim或者vi编写后缀名以.sh结尾的脚本

[root@localhost ] vim 定义脚本.sh 
#!/bin/bash     
#注意啦,这里必须以这个开头,调用其解释器
echo '=======================$n================================================================='
echo name:$0    #$0代表这个脚本名称,n为数字 
echo 1st"参数": $1 #执行时需要赋值
echo #    $1-$9代表第一个到第九个参数,十以上的参数需要大括号包含,例如${10}
echo 2st"参数": $2 #执行时需要赋值   
echo '=======================$#================================================================='
echo "参与的个数:" $#  #显示定义参数的个数
echo '=======================$*================================================================='
echo $* #代表命令行中所有的参数 (并把它们区分开来)
echo '=======================$@================================================================='
echo $@ #代表命令行中所有的参数(并把它们当作一个整体)
echo '=========================================================================================='
echo $((1+2)) #加减乘除运算符需要两个括号才能计算
echo '=========================================================================================='
echo $[1+2] #相当于上面、只是运算需要一个中括号即可
echo '=========================================================================================='
echo $? #最后一次命令的执行状态,0表示正常
echo '=========================================================================================='
#expr 1 + 2  1加2结果等于3,数字与等号间要有空格
#expr 10 - 5  10减5结果等于5,数字与等号间要有空格
#expr 10 \* 2  10乘以2结果等于20,数字与等号间要有空格
#expr 10 / 2  10除以2结果等于5,数字与等号间要有空格,\代表转义,把*转换成乘号
echo '=========================================================================================='
echo ############################################################################################
echo ###                例子
echo ###    1、a="expr 5 \* 2"           
echo ###       echo $a     结果是expr 5 \* 2
echo ###
echo ###    2、a=$(expr 5 \* 2)
echo ###       echo $a     结果是10
echo ###  
echo ###    3、a=`expr 5 \* 2`
echo ###       echo $a     结果是10
echo ###
echo ###    4、a=$[(2+3)*4]
echo ###       echo $a     结果是20
echo #############################################################################################
~                                                                                                        

2、赋予脚本执行权限

[root@localhost ] chmod +x 定义脚本.sh 
这里解释一下:chmod [选项] [脚本名]   代表赋予所有人都有执行权限
一般在个人实验中,是这样赋予执行权限的,因为除了你自己没人能用到你的,所有这样赋予权限是没问题的;
但在实际工作中,这样是不安全的,出于安全考虑,可以这样赋予权限

[root@localhost ] chmod u+x 定义脚本.sh
代表拥有者有执行权限,其他用户是没有的

这篇是关于shell脚本,大致提一下哈哈,下篇详细解释权限问题

3、看看脚本结果

[root@localhost ] ./定义脚本.sh  100 200 300 400
=======================$n=================================================================
name:./定义脚本.sh
1st参数: 100

2st参数: 200
=======================$#=================================================================
参与的个数: 4
=======================$*=================================================================
100 200 300 400
=======================$@=================================================================
100 200 300 400
==========================================================================================
3
==========================================================================================
3
==========================================================================================
0
==========================================================================================
==========================================================================================









[root@localhost shell脚本.sh] 

运行结果出来了,好多空白的地方是什么意思呢,这个具体看脚本内容大致就能了解清楚了

4、下面我们来编辑一个hello脚本

[root@localhost ~] vim hello.sh
[root@localhost ~] chmod +x hello.sh 
[root@localhost ~] ./hello.sh 
hello,world!
[root@localhost ~] cat hello.sh
#!/bin/bash
echo hello,world!

简单吧,接下来往前扩展一下,给代码加点颜色

#!/bin/bash
echo hello,world!
for i in {
   10..50}; do  #这里代表从10到50次
echo -e "\e[1;$i;31mhello,world!\e[0m"  #从10到50中以红色显示    
done

运行效果
在这里插入图片描述
还记得上篇文章提到过的吗?
格式:

echo -e "\e[1;42m xxx \e[0m"

这个命令会显示出设定的颜色,即\e[1是标准格式,代表颜色输出开始,\e[0m代表颜色输出结束。
普通颜色:31m定义字体是红色。echo能够识别的颜色如下:30m是黑色,31m是红色,32m是绿色,33m是黄色,34m是蓝色,35m是洋红,36m是青色,37m是白色;
背景色:40m是黑色,41m是红色,42m是绿色,43m是黄色,44m是蓝色,45m是洋红,46m是青色,47m是白色
————————————————
shell的强大不会只有hello,world吧???好了,接下来是介绍shell的重点

三、shell语句

1、if条件判断
单分支if条件语句
单分支的语句最简单,也最容易上手操作和理解,因为它只有一个判断条件,如果符合这个条件则会执行,反之,则不会执行,语法如下:

#!/bin/bash
if [ 条件判断式 ];    #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,fi结尾
then
    执行程序(echo ...)
fi

当然也可以这样写

#!/bin/bash
if [ 条件判断式 ]; then  
    执行程序(echo ...)
fi

例如

[root@localhost ] vim if1.sh
[root@localhost ] chmod +x if1.sh 
[root@localhost ] cat if1.sh
#!/bin/bash
aa=$(df -h |grep /dev/sda1 |awk '{print $5}' |cut -d "%" -f1)
#在查看已挂载的所有文件中通过筛选得到的值赋予变量aa
if [ "$aa" -ge 10 ];
#判断变量aa是否大于等于10
   then
        #如果大于等于10则执行该程序
        echo "大于等于!!!"
fi                                                                                                                                                                                                         

运行结果

[root@localhost ~] vim if1.sh
[root@localhost ~] chmod +x if1.sh 
[root@localhost ~] ./if1.sh 
大于等于!!!
[root@localhost ~]

双分支if条件语句

#!/bin/bash
if [ 条件判断式 ];        #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾
then
    条件成立时,执行程序
else
    条件不成立时,执行的另一个程序
fi

例如

[root@localhost ] vim if2.sh
[root@localhost ] chmod +x if2.sh 
[root@localhost ]./if2.sh 
httpd is down, must restart
[root@localhost ] cat if2.sh
#/bin/bash
aa=$(netstat -tuln |awk '{print $4}' |grep ":80$")
if [ "$aa" == "" ]
   then
        echo "httpd is down, must restart"
        /etc/rc.d/init.d/httpd start &>/dev/null
   else
        echo "httpd is ok"
fi

[root@localhost ] 解释:查看apache已开启的端口,用awk截取并输出第4列,再用grep筛选出80端口,如果aa为空,则输出httpd是关闭的,需要重启;否则,输出httpd是开启的

运行结果

[root@localhost ~] ./if2.sh 
httpd is down, must restart
[root@localhost ~] 

多支条件语句

#!/bin/bash
if [ 条件判断式1 ];        #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾
then
    当条件1条件成立时,执行程序1
elif [ 条件判断式2 ]then
     当条件2成立时,执行的程序2
…………省略更多条件…………        
else
    当所有条件都不成立时,执行该程序
fi

例如

[root@localhost ~] vim ip3.sh
[root@localhost ~] chmod +x ip3.sh 
[root@localhost ~] ./ip3.sh 
please input a filename: 123
222222222222222222222
[root@localhost ~] ./ip3.sh 
please input a filename: abc
222222222222222222222
[root@localhost ~] ./ip3.sh 
please input a filename: ..
.. is dire
[root@localhost ~] ./ip3.sh 
please input a filename: @
222222222222222222222
[root@localhost ~] cat ip3.sh 
#!/bin/bash

read -t 30 -p "please input a filename: " filename

if [ -z $filename ]
	then
		echo "1111111111111111111"
		exit 101
elif [ ! -e $filename ]
	then
		echo "222222222222222222222"
		exit 102
elif [ -f $filename ]
	then
		echo "$filename is putong"
		exit 103
elif [ -d $filename ]
	then
		echo "$filename is dire"
		exit 104
else
	echo "$filename is other file"
	exit 105

fi

[root@localhost ~] 解释:在控制台上提示用户输入一个文件名,并且只等待30秒,把用户的输入保存在变量filename里。
使用if判断该用户输入的字符串是否为空,如果为空则在屏幕上输出1111111……,退出状态码101;
如果不是,则往下走使用elif判断用户输入的该文件名是否存在,存在为真,则在屏幕上输出2222222……,退出状态码是102;
如果也不是,继续往下走使用elif判断用户输入的该文件名是否存在、并且是否为普通文件,是普通文件为真,则在屏幕上输出用户输出的这个文件名是普通文件(is putong),退出状态码103;
如果还不是,则判断该文件是否存在、并且为目录文件,是目录文件为真,则在屏幕上输出这个这个用户输出的文件名是目录(is dire),退出状态码是104;
……………………这里省略很多判断就不往下写了,可以使用elif一直判断
当所有的条件都不成立时,执行该程序,在屏幕上输出用户输出的这个文件是另一个文件(is other file),退出状态码是105.
最后以fi结尾,这就是个完整的if判断语句。

运行结果

[root@localhost ~] mkdir 123
[root@localhost ~] touch 456
[root@localhost ~] ./ip3.sh 
please input a filename: a
222222222222222222222
[root@localhost ~] echo $?
102
[root@localhost ~] ./ip3.sh 
please input a filename: ?
222222222222222222222
[root@localhost ~] echo $?
102
[root@localhost ~] ./ip3.sh 
please input a filename: 123
123 is dire
[root@localhost ~] echo $?
104
[root@localhost ~] ./ip3.sh 
please input a filename: 456
456 is putong
[root@localhost ~] echo $?
103
[root@localhost ~] ./ip3.sh 
please input a filename: 
1111111111111111111
[root@localhost ~] echo $?
101
[root@localhost ~]

2、case语句

#!/bin/bash
case $变量名 in
"值1")
      如果变量的值等于值1,则执行程序1
      ;;
"值2")
      如果变量的值等于值2,则执行程序2
      ;;
………………省略其他分支………………
*)
      如果变量的值都不是以上的值,则执行该程序
      ;;
esac

例如

#!/bin/bash
read -t 30 -p "please you input yes/no:" a
#在屏幕上输出“请你选择yes/no,然后把用户的输入赋予变量a”
case $a in
#判断变量a的值       
        yes)
        #如果是yes
            echo "you input is yes"
            exit 100
            执行程序1,并退出状态码100
            ;;
        no)
        #如果是no
            echo "you input is no"
            exit 101
            执行程序2,并退出状态码101
            ;;
        *)
        #如果既不是yes也不是no
            echo "you input is not"
            exit 102
            执行此程序,退出状态码102
            ;;
esac

[root@localhost ~] 解释:在屏幕上输出“请你选择yes/no,然后把用户的输入赋予变量a
通过case判断
如果用户输入的该变量是yes,则输出你输入的是yes(you input is yes),退出状态码100;
如果用户输入的该变量是no,则输出你输入的是no(you input is no),退出状态码101;
如果既不是yes也不是no,则输出你输入的是不存在的(you input is not),退出状态码102
最后以esac结尾,case开头,结尾再把字母反过来写,并且每个分支程序之后要通过";;"双分号结尾,代表该程序结束。

运行结果

[root@localhost ~] vim case.sh
[root@localhost ~] chmod +x case.sh 
[root@localhost ~] ./case.sh 
please you input yes/no:yes
you input is yes
[root@localhost ~] echo $?
100
[root@localhost ~] ./case.sh 
please you input yes/no:no
you input is no
[root@localhost ~] echo $?
101
[root@localhost ~] ./case.sh 
please you input yes/no:1
you input is not
[root@localhost ~] echo $?
102
[root@localhost ~] ./case.sh 
please you input yes/no:
you input is not
[root@localhost ~] echo $?
102

3、for循环

#!/bin/bash
for 变量 in 值1 值2 值3……
    do
        程序
    done

又或者

#!/bin/bash
for (( 初始值;循环控制条件;变量变化 ))
    do
        程序
    done

例如

#!/bin/bash
for i in 1 2 3 4
    do
       echo $i
    done
 

[root@localhost ~] 解释:把1,2,3,4这四个数赋予变量i,最后通过循环i这个变量在屏幕中输出显示

运行结果

[root@localhost ~] vim for1.sh
[root@localhost ~] chmod +x for1.sh
[root@localhost ~] ./for1.sh
1
2
3
4

又例如

#!/bin/bash
s=0
for (( i=1;i<=100;i=i+1 ))
#循环一百次
     do
          s=$(( $s+$i ))
          #每次循环给变量s赋值
     done
echo "输出从1加到100的值:" $s 

[root@localhost ~] 解释:定义循环100次,每次循环都给变量s赋值,最后输出从1加到100的值

运行结果

#!/bin/bash
s=0
for (( i=1;i<=100;i=i+1 ))
#循环一百次
     do
          s=$(( $s+$i ))
          #每次循环给变量s赋值
     done
echo "输出从1加到100的值:" $s 

4、while循环

#!/bin/bash
while [ 条件判断式 ]
     do
         程序
     done

例如

#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
   do
       s=$(( $s+$i ))
       i=$(( $i+1 ))
   done
echo "The sum is:" $s

[root@localhost ~] 解释:给变量i和s赋值,循环直到变量i的值大于100,就停止循环,最后是输出这个值在屏幕上

运行结果

[root@localhost ~] vim while.sh
[root@localhost ~] chmod +x while.sh
[root@localhost ~] ./while.sh
The sum is: 5050

5、until语句

#!/bin/bash
until [ 条件判断式 ]
    do
       程序
    done

例如

#!/bin/bash
i=1
s=0
until [ $i -gt 100 ]
      do
         s=$(( $i+$i ))
         i=$(( $i+1 ))
      done
echo "The sum is:" $s

[root@localhost ~] 解释:给变量i和变量s赋值,循环直到变量i的值大于100,就停止运行,最后输出在屏幕上

运行结果

[root@localhost ~] vim until.sh
[root@localhost ~] chmod +x until.sh
[root@localhost ~] ./until.sh
The sum is: 5050

6、函数

#!/bin/bash
function 函数名 () {
   
     程序
}

例如

#!/bin/bash
function sum () {
   
         s=0
         for (( i=0;i<=$1;i=i+1 ))
              do
                  s=$(( $i+$s ))
              done
          echo "The sum of 1+2+3+……+$1 is:" $s
}

read -t 30 -p "please input a number:" num
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
    then
         sum $num
    else
         echo "Error!! please input a number!"
fi

[root@localhost ~] 解释:先定义一个函数sum,再通过循环直到i大于$i位置,$1是函数sum的第一个参数。在函数中也可以使用位置参数变量,不过这里的$1指的是函数的第一个参数ÿ

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux爱好者LIANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值