1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > shell脚本从基础到实战(全网最详细)监控 加减乘除 购票 批量创建与删除用户等脚本

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

时间:2024-07-08 11:39:50

相关推荐

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 \* 2echo ###echo ### 2、a=$(expr 5 \* 2)echo ### echo $a结果是10echo ### echo ### 3、a=`expr 5 \* 2`echo ### echo $a结果是10echo ###echo ### 4、a=$[(2+3)*4]echo ### echo $a结果是20echo #############################################################################################~

2、赋予脚本执行权限

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

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

3、看看脚本结果

[root@localhost ] ./定义脚本.sh 100 200 300 400=======================$n=================================================================name:./定义脚本.sh1st参数: 1002st参数: 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/bashecho hello,world!

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

#!/bin/bashecho 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/bashif [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,fi结尾then执行程序(echo ...)fi

当然也可以这样写

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

例如

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

运行结果

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

双分支if条件语句

#!/bin/bashif [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,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/bashaa=$(netstat -tuln |awk '{print $4}' |grep ":80$")if [ "$aa" == "" ]thenecho "httpd is down, must restart"/etc/rc.d/init.d/httpd start &>/dev/nullelseecho "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/bashif [ 条件判断式1 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾then当条件1条件成立时,执行程序1elif [ 条件判断式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: 123222222222222222222222[root@localhost ~] ./ip3.sh please input a filename: abc222222222222222222222[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/bashread -t 30 -p "please input a filename: " filenameif [ -z $filename ]thenecho "1111111111111111111"exit 101elif [ ! -e $filename ]thenecho "222222222222222222222"exit 102elif [ -f $filename ]thenecho "$filename is putong"exit 103elif [ -d $filename ]thenecho "$filename is dire"exit 104elseecho "$filename is other file"exit 105fi

[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: a222222222222222222222[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: 123123 is dire[root@localhost ~] echo $?104[root@localhost ~] ./ip3.sh please input a filename: 456456 is putong[root@localhost ~] echo $?103[root@localhost ~] ./ip3.sh please input a filename: 1111111111111111111[root@localhost ~] echo $?101[root@localhost ~]

2、case语句

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

例如

#!/bin/bashread -t 30 -p "please you input yes/no:" a#在屏幕上输出“请你选择yes/no,然后把用户的输入赋予变量a”case $a in#判断变量a的值 yes)#如果是yesecho "you input is yes"exit 100执行程序1,并退出状态码100;;no)#如果是noecho "you input is no"exit 101执行程序2,并退出状态码101;;*)#如果既不是yes也不是noecho "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:yesyou input is yes[root@localhost ~] echo $?100[root@localhost ~] ./case.sh please you input yes/no:noyou input is no[root@localhost ~] echo $?101[root@localhost ~] ./case.sh please you input yes/no:1you 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/bashfor 变量 in 值1 值2 值3……do程序done

又或者

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

例如

#!/bin/bashfor i in 1 2 3 4doecho $idone

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

运行结果

[root@localhost ~] vim for1.sh[root@localhost ~] chmod +x for1.sh[root@localhost ~] ./for1.sh1234

又例如

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

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

运行结果

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

4、while循环

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

例如

#!/bin/bashi=1s=0while [ $i -le 100 ]dos=$(( $s+$i ))i=$(( $i+1 ))doneecho "The sum is:" $s

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

运行结果

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

5、until语句

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

例如

#!/bin/bashi=1s=0until [ $i -gt 100 ]dos=$(( $i+$i ))i=$(( $i+1 ))doneecho "The sum is:" $s

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

运行结果

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

6、函数

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

例如

#!/bin/bashfunction sum () {s=0for (( i=0;i<=$1;i=i+1 ))dos=$(( $i+$s ))doneecho "The sum of 1+2+3+……+$1 is:" $s}read -t 30 -p "please input a number:" numy=$(echo $num | sed 's/[0-9]//g')if [ -z "$y" ]thensum $numelseecho "Error!! please input a number!"fi

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

再通过接受用户输入的数字,并把值赋予变量num,同时把变量num的值替换为空,并赋予变量y;再判断变量y是否为空,以确定变量中num是否为数字,如果是数字,则调用sum函数,并把变量num的值作为第一个参数传递给sum函数,否则,如果变量sum的值不是数字,则输出报错信息

7、exit语句

在shell脚本中exit语句是用来退出当前脚本的语法如下:exit [返回值]

例如

#!/bin/bashread -t 30 -p "please input a number:" num#接受用户的输入,并把值赋予变量numy=$(echo $num | sed 's/[0-9]//g')#如果变量num的值是数字,则把num的值替换为空,否则不替换,并把替换的值赋予变量y[ -n "$y" ] && echo "Error! please input a number!" && exit 100#判断变量y的值是否不为空,输出报错信息并退出叫脚本,返回值是100echo "The number is:" $num#如果没有退出则打印变量num的值

运行结果

[root@localhost ~] vim exit.sh[root@localhost ~] chmod +x exit.sh [root@localhost ~] ./exit.sh please input a number:100The number is: 100[root@localhost ~] ./exit.sh please input a number:aError! please input a number![root@localhost ~] ./exit.sh please input a number:?Error! please input a number![root@localhost ~] echo $?100[root@localhost ~]

可想而知,如果我输入的不是数字,则会直接退出该脚本,退出码是100

8、break语句

#!/bin/bashfor (( 条件判断句 ))do程序语句break程序语句done

例如

#!/bin/bashfor (( i=1;i<=10;i=i+1 ))#循环10次doif [ "$i" -eq 4 ]#如果变量的值等于4thenbreak#退出整个循环fiecho $i#输出变量i的值done

运行结果

[root@localhost ~] vim break.sh[root@localhost ~] chmod +x break.sh [root@localhost ~] ./break.sh 123

9、continue语句

#!/bin/bashfor (( 条件判断语句 ))do程序语句continue程序语句done

例如

#!/bin/bashfor (( i=1;i<=10;i=i+1 ))doif [ "$i" -eq 4 ]thencontinue#退出语句换成continuefiecho $idone

运行结果

[root@localhost ~] vim continue.sh[root@localhost ~] chmod +x continue.sh [root@localhost ~] ./continue.sh 1235678910[root@localhost ~]

四、shell实战

学到这里那么就让我们进入实战吧,根据格式写脚本其实并不难,重要的是知道格式的同时也会敲命令(认识命令以及会使用命令)

1、脚本的语法格式

#!/bin/bash====================if单分支================================if [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,fi结尾then执行程序(echo ...)fiecho ====================if多分支===================================if [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾then执行程序elif [条件判断式 ];then执行程序else执行程序fiecho ===================case判断语法=============================case $变量名 in#变量名前面必须加$、后面必须加in,下一行以一个值判定、这个值可以是定义的任何东西、双引号可加可不加"值1") #如果是值1,则执行程序1,以此类推,最后以*结束、如果都不是以上值则执行此程序,每个判断和执行程序结尾都要以两个分号结尾,以esac结束该脚本如果变量的值等于值1,则执行程序1;;"值2")如果变量的值等于值2,则执行程序2;;.........省略其他分支..............*)如果都不是以上值,则执行此程序;;esacecho ===================for第一种循环语法=============================for (( 初始值;循环控制条件;变量变化 )) #初始值、循环控制条件、变量变化间要有空格,do开始、done结尾do执行程序doneecho ==================for第二种循环语法==============================for 变量 in 值1 值2 值3.... #for的取值范围就是in后面的这些值do执行程序(echo $变量 )doneecho ====================while循环语法================================while [ 条件判断式 ]do执行程序doneecho ====================read读取控制台输入语法================================read -t 30 -p "请您输入xxx:" xxx #read读取控制台输入,-t指定读取值时的时间(秒),如果不加则表示一直等待read -t 30 -p "请您输入yyy:" yyy #-p指定读取值时的提示符echo ==============================================================================

2、解释定义脚本

#!/bin/bashecho '=======================$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 \* 2echo ###echo ### 2、a=$(expr 5 \* 2)echo ### echo $a结果是10echo ### echo ### 3、a=`expr 5 \* 2`echo ### echo $a结果是10echo ###echo ### 4、a=$[(2+3)*4]echo ### echo $a结果是20echo #############################################################################################

运行结果

[root@localhost ] vim 解释定义脚本.sh [root@localhost ] chmod +x 解释定义脚本.sh [root@localhost ] ./解释定义脚本.sh =======================$n=================================================================name:./解释定义脚本.sh1st参数:2st参数:=======================$#=================================================================参与的个数: 0=======================$*========================================================================================$@===========================================================================================================================================================3==========================================================================================3==========================================================================================0====================================================================================================================================================================================[root@localhost ][root@localhost ] ./解释定义脚本.sh 200 300 600=======================$n=================================================================name:./解释定义脚本.sh1st参数: 2002st参数: 300=======================$#=================================================================参与的个数: 3=======================$*=================================================================200 300 600=======================$@=================================================================200 300 600==========================================================================================3==========================================================================================3==========================================================================================0====================================================================================================================================================================================[root@localhost ]

3、定义运算脚本

#!/bin/bashecho 1#a=$[$1 + $2] #运行时定义两个数#echo $1+$2= $aecho 2function add(){a=$[$1 + $2] #运行时定义两个数echo "和: "$a #调用a的值}read -t 30 -p "请您输入第一个整数:" xread -t 30 -p "请您输入第二个整数:" yecho "乘积:"$[$x * $y]echo "除以:"$[$x / $y]add $x $y

运算结果

[root@localhost ] vim 3定义运算.sh [root@localhost ] chmod +x 3定义运算.sh [root@localhost ] ./3定义运算.sh 12请您输入第一个整数:10请您输入第二个整数:20乘积:200除以:0和: 30[root@localhost ]

4、if判断程序员年龄脚本

#!/bin/bashecho =================整数间的判断========================echo ### -gt(大于) -lt(小于)echo ### -eq(等于) -ne(不等于) echo ### -ge(大于等于) -le(小于等于)echo ================文件权限的判断=======================echo ### -r(有读的权限)-w(有写的权限)echo ### -x(有执行的权限) -u(有SUID的权限)echo ### -g(有SGID权限) -k(有SBit权限)echo ================常用文件类型判断=====================echo ### -d(文件存在且是一个目录) echo ### -e(文件存在) -g(文件存在且是一个普通文件)echo =====================================================echo ##################################################### echo ===========================单分支格式=====================================read -t 30 -p "请您输入数字a:" a #-t代表30秒的时间,-p输出信息if [ $a -lt 18 ]; #判断变量a是否小于18,如果小于18则执行下一个语句thenecho "未成年人" && echo "$a小于18岁"elif [ $a -ge 18 ] && [ $a -lt 35 ]; #判断变量a是否等于18、小于35则执行下一个语句 thenecho "成年人" && echo "$a等于18岁且小于35岁"elif [ $a -gt 35 ] && [ $a -lt 60 ]; #判断变量a是否大于35,如果大于35则执行下一个语句 thenecho "青年人" && echo "$a大于35岁且小于60岁"elseecho "老年人" && echo "$a大于或等于60岁"fi

运行结果

[root@localhost ] vim if语法判断脚本.sh [root@localhost ] chmod +x if语法判断脚本.sh [root@localhost ] ./if语法判断脚本.sh =================整数间的判断========================================文件权限的判断=======================================常用文件类型判断=====================================================================================================单分支格式=====================================请您输入数字a:10未成年人10小于18岁[root@localhost ] ./if语法判断脚本.sh =================整数间的判断========================================文件权限的判断=======================================常用文件类型判断=====================================================================================================单分支格式=====================================请您输入数字a:20成年人20等于18岁且小于35岁[root@localhost ] ./if语法判断脚本.sh =================整数间的判断========================================文件权限的判断=======================================常用文件类型判断=====================================================================================================单分支格式=====================================请您输入数字a:45青年人45大于35岁且小于60岁[root@localhost ] ./if语法判断脚本.sh =================整数间的判断========================================文件权限的判断=======================================常用文件类型判断=====================================================================================================单分支格式=====================================请您输入数字a:60老年人60大于或等于60岁[root@localhost ]

5、case语法脚本

#!/bin/bashread -t 30 -p "please you input a num:" num #read在屏幕中输出,-t时间以秒为单位,-p输入一段话并赋值,>下面的是判断,如果等于1、则执行1下的echo,以两个分号结尾,最后以通配符结束,case开头、esac结束case $num in1)echo "one";;2)echo "two";;3)echo "three";;*)echo "其他的数字";;esac

运行结果

[root@localhost ] vim case语法脚本.sh [root@localhost ] chmod +x case语法脚本.sh [root@localhost ] ./case语法脚本.sh please you input a num:1 one[root@localhost ][root@localhost ] ./case语法脚本.sh please you input a num:2two[root@localhost ][root@localhost ] ./case语法脚本.sh please you input a num:3three[root@localhost ][root@localhost ] ./case语法脚本.sh please you input a num:4其他的数字

6、for循环脚本

#!/bin/bashecho '=======================$*==============================='for abc in "$*" #两者区别:执行的时候i需要在./xxx.sh后加入定义的数字或者字母v,如果不加引号结>果完全一样,加了引号$*会排列整齐,$@会一个接一个按行排列doecho $abcdoneecho '=======================$@==============================='for abc in "$@"doecho $abcdoneecho "========================================================"

运行结果

[root@localhost ] vim for循环语法脚本.sh [root@localhost ] chmod +x for循环语法脚本.sh [root@localhost ] ./for循环语法脚本.sh =======================$*======================================================$@=======================================================================================[root@localhost ][root@localhost ] ./for循环语法脚本.sh 100=======================$*===============================100=======================$@===============================100========================================================[root@localhost ][root@localhost ] ./for循环语法脚本.sh 100 200=======================$*===============================100 200=======================$@===============================100200========================================================[root@localhost ][root@localhost ] ./for循环语法脚本.sh 100 200 abc=======================$*===============================100 200 abc=======================$@===============================100200abc========================================================[root@localhost ]

7、for数字计算脚本

#!/bin/bash#用for循环进行实现,执行的时候需要在./xxx后赋值(数字),就可以从1一直加到赋予的值for (( i=1; i <= $1; i++ ))dosum=$[ $sum + $i ]doneecho $sum

运行结果

[root@localhost ] vim for数字计算脚本.sh [root@localhost ] chmod +x for数字计算脚本.sh [root@localhost ] ./for数字计算脚本.sh 100 5050[root@localhost ] ./for数字计算脚本.sh 999499500[root@localhost ]

8、while循环脚本

#!/bin/bash#用while循环做一个实现a=1while [ $a -le $1 ]dosum2=$[ $sum2 + $a ]a=$[$a + 1]doneecho $sum2

运行结果

[root@localhost ] vim while循环语法脚本.sh [root@localhost ] chmod +x while循环语法脚本.sh [root@localhost ] ./while循环语法脚本.sh 1000500500[root@localhost ] ./while循环语法脚本.sh 888394716[root@localhost ]

9、read读取控制台输入脚本

#!/bin/bashread -t 30 -p "please you input a number:" num1#请您输入第一个数字,并赋值num1read -t 30 -p "please you input a number:" num2#请您输入第一个数字,并赋值num2read -t 30 -p "please you input a operation[+-*/]:" oper#请您输入第一个运算符,并赋值operif [[ $oper == "+" ]];thenecho $(( $num1+$num2 )) && echo "您输入的是$num1加$num2,结果是$(( $num1+$num2 ))"fiif [[ $oper == "-" ]];thenecho $(( $num1-$num2 )) && echo "您输入的是$num1减$num2,结果是$(( $num1-$num2 ))"fiif [[ $oper == "*" ]];thenecho $(( $num1*$num2 )) && echo "您输入的是$num1乘$num2,结果是$(( $num1*$num2 ))"fiif [[ $oper == "/" ]];thenecho $(( $num1/$num2 )) && echo "您输入的是$num1除$num2,结果是$(( $num1/$num2 ))"fi

运行结果

[root@localhost ~] vim read.sh [root@localhost ~] chmod +x read.sh [root@localhost ~] ./read.sh please you input a number:10please you input a number:20please you input a operation[+-*/]:+30您输入的是10加20,结果是30[root@localhost ~] ./read.sh please you input a number:100please you input a number:9please you input a operation[+-*/]:-91您输入的是100减9,结果是91[root@localhost ~] ./read.sh please you input a number:999please you input a number:3please you input a operation[+-*/]:/333您输入的是999除3,结果是333[root@localhost ~] ./read.sh please you input a number:9999please you input a number:100please you input a operation[+-*/]:*999900您输入的是9999乘100,结果是999900[root@localhost ~]#

10、归档脚本

#!/bin/bash#首先判断输入参数个数是否不等于1if [ $# -ne 1 ]thenecho "参数个数错误!应该输入一个参数,作为归档目录名"fi#从参数中获取目录名称if [ -d $1 ]thenechoelseechoecho "目录不存在!"exitfiDIR_NAME=$(basename $1) #选取变量1的文件名称DIR_PATH=$(cd $(dirname $1); pwd) #切换文件的绝对路径名称、并且显示当前的路径#获取当前日期DATE=$(date +%Y%m%d)#定义生成的归档文件名称FILE=xxx_${DIR_NAME}_$DATE.tar.gz#定义生成路径DEST=/xxx/$FILE#xxx这个是某某某,名字可以自定义#开始归档目录文件echo "开始归档......"echo tar -czf $DEST $DIR_PATH/$DIR_NAMEif [ $? -eq 0 ]thenechoechoecho "归档成功!"echo "归档文件为: $DEST"echoelseecho "归档出现问题!"echofi

运行结果

[root@localhost ~] vim 归档脚本.sh [root@localhost ~] chmod +x 归档脚本.sh [root@localhost ~] mkdir -p xxx/xxx1 #首先创建一个文件以及递归文件,也可以定义需要归档的目录和文件[root@localhost ~] ./归档脚本.sh xxx/xxx1 #后面接文件的绝对路径名开始归档......tar: 从成员名中删除开头的“/”归档成功!归档文件为: xxx_xxx1_0429.tar.gz[root@localhost ~] tar -zxvf /xxx_xxx1_0429.tar.gz #解压root/xxx/root/xxx/xxx1/[root@localhost ~] ./归档脚本.sh xxxxxxxxx目录不存在![root@localhost ~]

11、发消息脚本

#!/bin/bash#查看用户是否登陆login_user=$(who |grep -i -m 1 $1 |awk '{print $1}')if [ -z $login_user ]thenecho "$1 不在线!"echo "脚本退出...."exitfi#查看用户是否开启消息功能is_allowed=$(who -T |grep -i -m 1 $1 |awk '{print $2}')if [ $is_allowed != "+" ]thenecho "$1 没有开启消息功能!"echo "脚本退出..."exitfi#确定是否有消息发送if [ -z $2 ]thenecho "没有消息发送!"echo "脚本退出..."exitfi#从参数中获取要发送的消息whole_msg=$(echo $* |cut -d " " -f 2-)#获取用户登陆的终端user_terminal=$(who |grep -i -m 1 $1 |awk '{print $2}')#写入要发送的信息echo $whole_msg |write $login_user $user_terminalif [ $? != 0 ]thenecho "发送失败!"elseecho "发送成功!"fiexit

运行结果

[root@localhost ] vim 发消息脚本.sh [root@localhost ] chmod +x 发消息脚本.sh [root@localhost ] ./发消息脚本.sh 用法: grep [选项]... PATTERN [FILE]...试用‘grep --help’来获得更多信息。不在线!脚本退出....[root@localhost ] ./发消息脚本.sh root #后面必须指定某用户root 没有开启消息功能!脚本退出...[root@localhost ] useradd xxx #创建用户xxx[root@localhost ] echo "123456" |passwd --stdin xxx #给用户xxx设置密码更改用户 xxx 的密码 。passwd:所有的身份验证令牌已经成功更新。[root@localhost ] ./发消息脚本.sh xxxxxx 不在线!脚本退出....[root@localhost ]

12、监控脚本

#!/bin/bash#虚拟机现在的时间Time=$(date +%Y年-%m月-%d日-%H时-%M分-%s秒)#内存echo "开始检查........." >> $Time.logNC1=`cat /proc/meminfo |grep "MemTotal" |tr -s " " |cut -d" " -f2` #总内存echo "总内存容量:$NC1"KB"" >> $Time.logNC2=`cat /proc/meminfo |grep "MemFree" |tr -s " " |cut -d" " -f2` #空闲内存echo "空闲内存容量:$NC2"KB"" >> $Time.logNC3=`cat /proc/meminfo |grep "MemAvailable" |tr -s " " |cut -d" " -f2` #可用内存echo "可用内存容量:$NC3"KB"" >> $Time.logNC4=`cat /proc/meminfo |grep "SwapTotal" |tr -s " " |cut -d" " -f2` #交换内存echo "交换内存容量:$NC4"KB"" >> $Time.logNC5=`cat /proc/meminfo |grep "SwapFree" |tr -s " " |cut -d" " -f2` #空闲交换内存echo "空闲交换内存容量:$NC5"KB"" >> $Time.logmem=$(free |grep Mem |awk '{print echo "剩余内存:"$7}') #查看内存状态echo $mem"KB" >> $Time.log#把查看内存的状态写入定义的日志文件#获取磁盘使用率ROOT=`df | grep "/$" | tr -s " " | cut -d" " -f5 | cut -d"%" -f1` #磁盘使用率BOOT1=`df | grep "/boot$" | tr -s " " | cut -d" " -f5 | cut -d"%" -f1` #磁盘/boot 使用率BOOT2=`df -h |grep "/boot" |awk '{print echo "已用内存:"$3}'`#boot已用内存BOOT3=`df -h |grep "/boot" |awk '{print echo "可用内存:"$4}'`#boot可用内存echo "磁盘根文件使用率:"${ROOT}%,"磁盘/boot使用率:""${BOOT1}%" >> $Time.logecho "/boot文件${BOOT2}"",""/boot文件${BOOT3}" >> $Time.log#disk磁盘Disk=$(df -Th |grep "/$" |awk '{print echo "磁盘根文件系统使用率(%):"$6}')CP=$(df -Th |grep "/$" |awk '{print echo "磁盘根文件系统已用:"$4,echo "磁盘根文件系统可用:"$5}')echo $CP >> $Time.logecho $Disk >> $Time.log#cpuCPU1=`cat /proc/loadavg | cut -d" " -f3`CPU2=$(top -n1 |grep "Cpu(s):" |awk '{print echo "用户CPU使用率(%):"$2"%" "," echo "内核空间CPU使用率(%):"$4"%" "," echo "空闲CPU百分比(%):"$8"%"}')echo "CPU 平均负载(%):"$CPU1 >> $Time.logecho $CPU2 >> $Time.log#虚拟机ip地址XNJ=$(ifconfig eth0 |grep "inet " |awk '{print echo "这个虚拟机的ip地址:"$2}')echo "开始检查ip地址----- $XNJ" >> $Time.log#在线主机用户名ZXYH=$(who |awk '{print echo "用户名:"$1}')#在线用户统计ZXYHTJ=$(who |wc -l)#进程统计JC=$(ps -aux |wc -l)echo "当前的主机名:"$(uname -n)echo "--------------------------------------------------------------------------------------------------"echo "总内存容量:"$NC1"KB"echo "--------------------------------------------------------------------------------------------------"echo $mem"KB"echo "--------------------------------------------------------------------------------------------------"echo $Disk echo "--------------------------------------------------------------------------------------------------"echo $CPecho "--------------------------------------------------------------------------------------------------"echo "磁盘/boot使用率(%):"$BOOT1"磁盘使用率(%):"$ROOTecho "--------------------------------------------------------------------------------------------------"echo "/boot"$BOOT2 "/boot"$BOOT3echo "--------------------------------------------------------------------------------------------------"echo "CPU平均负载""(%):"$CPU1echo "--------------------------------------------------------------------------------------------------"echo $CPU2echo "--------------------------------------------------------------------------------------------------"echo $XNJ echo "--------------------------------------------------------------------------------------------------"echo "在线主机用户名:$ZXYH "," 在线用户统计:$ZXYHTJ "," 进程统计:$JC "echo "--------------------------------------------------------------------------------------------------"echo "当前时间是:$Time "echo "--------------------------------------------------------------------------------------------------"if [[ $mem < 1024000 ]];thenecho "告警:服务器$XNJ 可用内存容量不足 1GB,仅剩$mem!" | mail -s "告警:可用内存不足 1GB" root@localhostfiif [[ $CPU > 0.8 ]];thenecho "警告:服务器$XNJ CPU平均负载超过80%,已达$CPU!" |mail -s "警告:CPU平均负载超过80%" root@localhostfiif [[ $ROOT > 90 ]];thenecho "告警:服务器$XNJ 磁盘根文件系统使用率超过 90%,已达$ROOT!" | mail -s "告警:磁盘使用率超过 90%" root@localhostfiif [[ $BOOT1 > 90 ]];thenecho "告警:服务器$XNJ 磁盘/boot 使用率超过 90%,已达$BOOT1!" | mail -s "告警:磁盘使用率超过 90%" root@localhostfichmod 777 /监控脚本.sh #赋予权限echo "*/30 * * * * /监控脚本.sh" >> /var/spool/cron/root #写一个周期任务每30分钟执行一次脚本监控

运行结果

[root@localhost ] vim 监控脚本.sh [root@localhost ] chmod +x 监控脚本.sh [root@localhost ] ./监控脚本.sh 当前的主机名:localhost.localdomain--------------------------------------------------------------------------------------------------总内存容量:3861264KB--------------------------------------------------------------------------------------------------剩余内存:2829832KB--------------------------------------------------------------------------------------------------磁盘根文件系统使用率(%):10%--------------------------------------------------------------------------------------------------磁盘根文件系统已用:5.0G 磁盘根文件系统可用:46G--------------------------------------------------------------------------------------------------磁盘/boot使用率(%):24 磁盘使用率(%):10--------------------------------------------------------------------------------------------------/boot已用内存:238M /boot可用内存:777M--------------------------------------------------------------------------------------------------CPU平均负载(%):0.05--------------------------------------------------------------------------------------------------用户CPU使用率(%):0.8%,内核空间CPU使用率(%):0.0%,空闲CPU百分比(%):99.2%--------------------------------------------------------------------------------------------------这个虚拟机的ip地址:192.168.16.130--------------------------------------------------------------------------------------------------在线主机用户名:用户名:root用户名:root , 在线用户统计:2 , 进程统计:268 --------------------------------------------------------------------------------------------------当前时间是:-04月-29日-05时-55分-1651211722秒 --------------------------------------------------------------------------------------------------[root@localhost ][root@localhost ] crontab -l #查看定时任务*/30 * * * * /监控脚本.sh[root@localhost ] crontab -r #删除定时任务[root@localhost ] ls #列出通过通过脚本生成的日志文件-04月-29日-05时-55分-1651211722秒.log [root@localhost ] cat -04月-29日-05时-55分-1651211722秒.log #查看日志文件开始检查.........总内存容量:3861264KB空闲内存容量:2163008KB可用内存容量:2829684KB交换内存容量:4063228KB空闲交换内存容量:4063228KB剩余内存:2829832KB磁盘根文件使用率:10%,磁盘/boot使用率:24%/boot文件已用内存:238M,/boot文件可用内存:777M磁盘根文件系统已用:5.0G 磁盘根文件系统可用:46G磁盘根文件系统使用率(%):10%CPU 平均负载(%):0.05用户CPU使用率(%):0.8%,内核空间CPU使用率(%):0.0%,空闲CPU百分比(%):99.2%开始检查ip地址----- 这个虚拟机的ip地址:192.168.16.130[root@localhost ]

13、if计算器脚本

#!/bin/bash#字符界面加减乘除计算器read -t 30 -p "Please input num1: " num1read -t 30 -p "Please input num2: " num2#通过read命令接收要计算的数值,并赋予变量num1和num2read -t 30 -p "Please input a operator: " ope#通过read命令接收要计算的符号,并赋予变量opeif [ -n "$num1" -a -n "$num2" -a -n "$ope" ]#第一层判断,用来判断num1、num2和ope中都有值thentest1=$(echo $num1 | sed 's/[0-9]//g')test2=$(echo $num2 | sed 's/[0-9]//g')#定义变量test1和test2的值为$(命令)的结果#后续命令作用是,把变量test1的值替换为空。如果能替换为空,证明num1的值为数字#如果不能替换为空,证明num1的值为非数字。我们使用这种方法判断变量num1的值为数字#用同样的方法测试test2变量if [ -z "$test1" -a -z "$test2" ]#第二层判断,用来判断num1和num2为数值#如果变量test1和test2的值为空,则证明num1和num2是数字then#如果test1和test2是数字,则执行以下命令if [ "$ope" == '+' ]#第三层判断用来确认运算符#测试变量$ope中是什么运算符thenvalue=$(( $num1 + $num2 ))#如果是加号则执行加法运算elif [ "$ope" == '-' ]thenvalue=$(( $num1 - $num2 ))#如果是减号,则执行减法运算elif [ "$ope" == '*' ]thenvalue=$(( $num1 * $num2 ))elif [ "$ope" == '/' ]thenvalue=$(( $num1 / $num2 ))elseecho "Please enter a valid symbol"#如果运算符不匹配,提示输入有效的符号exit 10#并退出程序,返回错误代码10fielse#如果test1和test2不为空,说明num1和num2 不是数字echo "Please enter a valid value"#则提示输入有效的数值exit 11#并退出程序,返回错误代码11fielseecho "qing shuru neirong"exit 12 fiecho " $num1 $ope $num2 : $value"#输出数值运算的结果

运算结果

[root@localhost ] vim if计算器脚本.sh[root@localhost ] chmod +x if计算器脚本.sh [root@localhost ] ./if计算器脚本.sh Please input num1: 100Please input num2: 200Please input a operator: +100 + 200 : 300[root@localhost ] ./if计算器脚本.sh Please input num1: 999Please input num2: 21Please input a operator: /999 / 21 : 47 #在shell脚本中,一个数字与另一个数字相除是不会显示小数点后面几位的[root@localhost ] ./if计算器脚本.sh Please input num1: 79798798Please input num2: 4556 Please input a operator: -79798798 - 4556 : 79794242[root@localhost h] ./if计算器脚本.sh Please input num1: 849844Please input num2: 54665465Please input a operator: +849844 + 54665465 : 55515309[root@localhost ]

14、until脚本

#!/bin/bashi=1s=0until [ $i -gt 100 ]dos=$(( $s+$i ))i=$(( $i+1 ))doneecho $s

运行结果

[root@localhost ] vim until脚本.sh[root@localhost ] chmod +x until脚本.sh [root@localhost ] ./until脚本.sh 5050 #从1一直加到100[root@localhost ]

15、购票脚本

1)

#!/bin/bashuntil [[ $i == 7 ]] #一直循环,输入不属于0到6的树退出循环,否则继续执行doecho ###########################echo "欢迎进入购票系统购票!"echo "购买去海口的票请输入1"echo "购买去北京的票请输入2"echo "购买去广州的票请输入3"echo "购买去上海的票请输入4"echo "购买去长沙的票请输入5"echo "购买去成都的票请输入6"echo "退出购票系统输入其它数或不输入即可"echo ########################################read -t 30 -p "请您输入要去需要去的地方[1-6]:" icase $i in1)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是海口,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;2)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是北京,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;3)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是广州,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;4)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是上海,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;5)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是长沙,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;6)for operation in 1 2 3 4 5 6doecho "购票成功!" && echo "您要去的地方是成都,请您耐心等待!" || echo "购票失败,请您重新购买!"done;;*)exit;;esacdone

运行结果

[root@localhost ] vim until和case购票脚本.sh[root@localhost ] chmod +x until和case购票脚本.sh [root@localhost ] ./until和case购票脚本.sh 欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:1购票成功!您要去的地方是海口,请您耐心等待!购票成功!您要去的地方是海口,请您耐心等待!购票成功!您要去的地方是海口,请您耐心等待!购票成功!您要去的地方是海口,请您耐心等待!购票成功!您要去的地方是海口,请您耐心等待!购票成功!您要去的地方是海口,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:2购票成功!您要去的地方是北京,请您耐心等待!购票成功!您要去的地方是北京,请您耐心等待!购票成功!您要去的地方是北京,请您耐心等待!购票成功!您要去的地方是北京,请您耐心等待!购票成功!您要去的地方是北京,请您耐心等待!购票成功!您要去的地方是北京,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:3购票成功!您要去的地方是广州,请您耐心等待!购票成功!您要去的地方是广州,请您耐心等待!购票成功!您要去的地方是广州,请您耐心等待!购票成功!您要去的地方是广州,请您耐心等待!购票成功!您要去的地方是广州,请您耐心等待!购票成功!您要去的地方是广州,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:4购票成功!您要去的地方是上海,请您耐心等待!购票成功!您要去的地方是上海,请您耐心等待!购票成功!您要去的地方是上海,请您耐心等待!购票成功!您要去的地方是上海,请您耐心等待!购票成功!您要去的地方是上海,请您耐心等待!购票成功!您要去的地方是上海,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:5购票成功!您要去的地方是长沙,请您耐心等待!购票成功!您要去的地方是长沙,请您耐心等待!购票成功!您要去的地方是长沙,请您耐心等待!购票成功!您要去的地方是长沙,请您耐心等待!购票成功!您要去的地方是长沙,请您耐心等待!购票成功!您要去的地方是长沙,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:6购票成功!您要去的地方是成都,请您耐心等待!购票成功!您要去的地方是成都,请您耐心等待!购票成功!您要去的地方是成都,请您耐心等待!购票成功!您要去的地方是成都,请您耐心等待!购票成功!您要去的地方是成都,请您耐心等待!购票成功!您要去的地方是成都,请您耐心等待!欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:0[root@localhost ] ./until和case购票脚本.sh 欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:7[root@localhost ] ./until和case购票脚本.sh 欢迎进入购票系统购票!购买去海口的票请输入1购买去北京的票请输入2购买去广州的票请输入3购买去上海的票请输入4购买去长沙的票请输入5购买去成都的票请输入6退出购票系统输入其它数或不输入即可请您输入要去需要去的地方[1-6]:l[root@localhost ]

2)

#!/bin/bashecho -e \nread -t 30 -p "请您输入要去的地方并购买相应的票[1-5]:" icase $i in1)for i in 1 2 3 4 5doecho $i && echo "购票成功!您要去的地方是北京!" || echo " 购票失败,请您重新购买!"done;;2)for i in 1 2 3 4 5doecho $i && echo "购票成功!您要去的地方是上海!" || echo "购票失败,请您重新购买!"done;;3)for i in 1 2 3 4 5doecho $i && echo "购票成功!您要去的地方是广州!" || echo "购票失败,请您重新购买!"done;;4)for i in 1 2 3 4 5doecho $i && echo "购票成功!您要去的地方是成都!" || echo "购票失败,请您重新购买!"done;;5)for i in 1 2 3 4 5doecho $i && echo "购票成功! 您要去的地方是长沙!" || echo "购票失败,请您重新购买!"done;;*)exit;;esac

运行结果

[root@localhost ] vim for和case购票脚本.sh[root@localhost ] chmod +x for和case购票脚本.sh [root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:11购票成功!您要去的地方是北京!2购票成功!您要去的地方是北京!3购票成功!您要去的地方是北京!4购票成功!您要去的地方是北京!5购票成功!您要去的地方是北京![root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:21购票成功!您要去的地方是上海!2购票成功!您要去的地方是上海!3购票成功!您要去的地方是上海!4购票成功!您要去的地方是上海!5购票成功!您要去的地方是上海![root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:31购票成功!您要去的地方是广州!2购票成功!您要去的地方是广州!3购票成功!您要去的地方是广州!4购票成功!您要去的地方是广州!5购票成功!您要去的地方是广州![root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:41购票成功!您要去的地方是成都!2购票成功!您要去的地方是成都!3购票成功!您要去的地方是成都!4购票成功!您要去的地方是成都!5购票成功!您要去的地方是成都![root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:51购票成功! 您要去的地方是长沙!2购票成功! 您要去的地方是长沙!3购票成功! 您要去的地方是长沙!4购票成功! 您要去的地方是长沙!5购票成功! 您要去的地方是长沙![root@localhost ] ./for和case购票脚本.sh n请您输入要去的地方并购买相应的票[1-5]:0[root@localhost ]

16、mariadb数据库

#!/bin/bashset -eou pipefail#安装 mariadb 并在其配置文件的第 9 行后dd面添加 2 行配置yum -y install mariadb-server &>/dev/null && {sed -i '9a character-set-server=utf8' /etc/f; sed -i '10a innodb_file_per_table=1' /etc/f; } || {echo "安装失败";exit; }#启动 mariadbsystemctl start mariadb.service &>/dev/null#设置 mariadb 开机自动启动systemctl enable mariadb.service &>/dev/null#设置 mariadb root 帐号的密码,默认为空,不安全,创建abc666的用户,密码abcd666,数据库名也是abc666mysqladmin -uroot password "abcd666" &>/dev/null && echo "修改密码成功" || echo "修改密码失败" #创建数据库mysql -uroot -pabcd666 -e "create database abc666 character set utf8 collate utf8_bin;" && echo "创建数据库成功" || echo "创建数据库失败" #创建数据库abc666mysql -uroot -pabcd666 -e "create user 'abc666'@'localhost' identified by 'abc666';" && echo "创建用户成功" || echo "创建用户失败" #对abc666 用户授权管理 abc666 数据库mysql -uroot -pabcd666 -e "grant all privileges on abc666.* to 'abc666'@'localhost' identified by 'abcd666';" && echo "授权成功" || echo "授权失败" #刷新权限mysql -uroot -pabcd666 -e "flush privileges;" && echo "刷新权限成功" || echo "刷新权限失败" #创建数据表mysql -uroot -pabcd666 -D abc666 -e "create table server_state_info(id int unsigned auto_increment,report_time datetime not null,ip char(128) not null,cpu_percent float unsigned not null,memory_percent float unsigned not null,disk_percent varchar(200) not null,primary key (id));" && echo ">创建数据表成功" || echo "创建数据表失败" #创建索引mysql -uroot -pabcd666 -D abc666 -e "create index server_ip on server_state_info(ip);" && echo "创建索引成功" || echo "创建索引失败"

运行结果

[root@localhost ] vim mariadb数据库.sh[root@localhost ] chmod +x mariadb数据库.sh [root@localhost ] ./mariadb数据库.sh 修改密码成功创建数据库成功创建用户成功授权成功刷新权限成功创建数据表成功创建索引成功[root@localhost ]

在数据库中插入一段数据在数据表中,实现监控效果

#!/bin/bashset -eou pipefail#获取当前时间作为检查开始的时间DATE_TIME=`date +%Y%m%d%H%M%S`#获取服务器 IP 地址IP_ADDR=`/usr/sbin/ip addr sh eth0 | grep "inet " | tr -s " " | cut -d" " -f3 | cut -d"/" -f1`#获取内存使用率MEM_TOTAL=`cat /proc/meminfo | grep MemTotal | tr -s " " | cut -d" " -f 2`MEM_FREE=`cat /proc/meminfo | grep MemFree | tr -s " " | cut -d" " -f 2`#小数计算需要使用 bc,scale=2 表示保留 2 为小数,当整数部分为 0 时,bc 会在输出结果时忽略掉整数部分的 0,只显示.xx,所以需要在前面加个 0MEM_USED_PERCENT="0$(echo "scale=2;($MEM_TOTAL-$MEM_FREE)/$MEM_TOTAL" | bc)"#获取磁盘使用率ROOT_USED=`df | grep "/$" | tr -s " " | cut -d" " -f5 | cut -d"%" -f1`#获取 15 分钟 CPU 平均负载CPU_AVG=`cat /proc/loadavg | cut -d" " -f3`#将上述数据写入数据库 shellmon 的 server_state_info 表(report_time,ip,cpu_percent,memory_percent,disk_percent)mysql -uljt666 -pliang666 -D ljt666 -e "insert into server_state_info(report_time,ip,cpu_percent,memory_percent,disk_percent) values(${DATE_TIME},'${IP_ADDR}',${CPU_AVG},${MEM_USED_PERCENT},'${ROOT_USED}');"

运行效果

[root@localhost ~] vim mariadb.sh[root@localhost ~] chmod +x mariadb.sh [root@localhost ~] ./mariadb.sh [root@localhost ~][root@localhost ~] mysql -uabc666 -pabcd666 -D abc666 -e "select * from server_state_info;"+----+---------------------+----------------+-------------+----------------+--------------+| id | report_time | ip | cpu_percent | memory_percent | disk_percent |+----+---------------------+----------------+-------------+----------------+--------------+| 1 | -04-29 07:43:38 | 192.168.16.140 | 0.1 | 0.48 | 10 |+----+---------------------+----------------+-------------+----------------+--------------+[root@localhost ~] mysql -uroot -p #使用root账户登录数据库Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 13Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, , Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> show databases; #查看数据库+--------------------+| Database |+--------------------+| information_schema || abc666 || mysql || performance_schema || test|+--------------------+5 rows in set (0.00 sec)MariaDB [(none)]> use mysql #进入数据库Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMariaDB [mysql]> show tables; #查看表+---------------------------+| Tables_in_mysql |+---------------------------+| columns_priv || db || event || func || general_log|| help_category || help_keyword || help_relation || help_topic|| host || ndb_binlog_index|| plugin|| proc || procs_priv|| proxies_priv || servers || slow_log || tables_priv|| time_zone || time_zone_leap_second|| time_zone_name || time_zone_transition|| time_zone_transition_type || user |+---------------------------+24 rows in set (0.00 sec)MariaDB [mysql]> exitBye[root@localhost ~]

又或者插入这个脚本,效果是一样的

#!/bin/bashset -eou pipefail#获取当前时间作为检查开始的时间DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`#获取服务器 IP 地址IP_ADDR=`/usr/sbin/ip addr sh eth0 | grep "inet " | tr -s " " | cut -d" " -f3 | cut -d"/" -f1`#获取内存使用率MEM_TOTAL=`cat /proc/meminfo | grep MemTotal | tr -s " " | cut -d" " -f 2`MEM_FREE=`cat /proc/meminfo | grep MemFree | tr -s " " | cut -d" " -f 2`#小数计算需要使用 bc,scale=2 表示保留 2 为小数,当整数部分为 0 时,bc 会在输出结果时忽略MEM_USED_PERCENT="0$(echo "scale=2;($MEM_TOTAL-$MEM_FREE)/$MEM_TOTAL" | bc)"#获取磁盘使用率ROOT_USED=`df | grep "/$" | tr -s " " | cut -d" " -f5 | cut -d"%" -f1`#获取 15 分钟 CPU 平均负载CPU_AVG=`cat /proc/loadavg | cut -d" " -f3`mysql -uabc666 -pabcd666 -D abc666 -e "insert into server_state_info(report_time,ip,cpu_percent,memory_percent,disk_percent) values(${DATE_TIME},'${IP_ADDR}',${CPU_AVG},${MEM_USED_PERCENT},'${ROOT_USED}');"

运行结果

[root@localhost ~] vim mariadb2.sh[root@localhost ~] chmod +x mariadb2.sh [root@localhost ~] ./mariadb2.sh [root@localhost ~] mysql -uabc666 -pabcd666 -D abc666 -e "select * from server_state_info;"+----+---------------------+----------------+-------------+----------------+--------------+| id | report_time | ip | cpu_percent | memory_percent | disk_percent |+----+---------------------+----------------+-------------+----------------+--------------+| 1 | -04-29 07:43:38 | 192.168.16.140 | 0.1 | 0.48 | 10 || 2 | 0000-00-00 00:00:00 | 192.168.16.140 | 0.05 | 0.49 | 10 |+----+---------------------+----------------+-------------+----------------+--------------+[root@localhost ~]

数据库的命令当然远不止这些,我就不细细详说了,实现数据库监控主机,这只是一个模板,可以根据需要修改里面的内容即可

17、批量添加用户脚本

#!/bin/bashecho ##################################################read -t 30 -p "请您输入要创建的用户名:" nameread -t 30 -p "请您输入要创建用户的数量:" numread -t 30 -p "请您输入要创建用户的初始密码:" passwdecho ##################################################if [ ! -z "$name" -a ! -z "$num" -a ! -z "$passwd" ]theny=$(echo $num | sed 's/[0-9]//g')if [ -z "$y" ]thenfor (( i=1;i<=$num;i=i+1 ))do/usr/sbin/useradd $name$i &>/dev/nullecho $passwd | /usr/bin/passwd --stdin $name$i &>/dev/nullchage -d 0 $name$i &>/dev/nulldonefifi

运行结果

[root@localhost ] vim a批量添加用户.sh[root@localhost ] chmod +x a批量添加用户.sh [root@localhost ] ./a批量添加用户.sh 请您输入要创建的用户名:xxx请您输入要创建用户的数量:100请您输入要创建用户的初始密码:123456[root@localhost ] tail -n 100 /etc/passwd #在用户密码文件中查看最后100行内容xxx1:x:1002:1002::/home/xxx1:/bin/bashxxx2:x:1003:1003::/home/xxx2:/bin/bashxxx3:x:1004:1004::/home/xxx3:/bin/bashxxx4:x:1005:1005::/home/xxx4:/bin/bashxxx5:x:1006:1006::/home/xxx5:/bin/bashxxx6:x:1007:1007::/home/xxx6:/bin/bashxxx7:x:1008:1008::/home/xxx7:/bin/bashxxx8:x:1009:1009::/home/xxx8:/bin/bashxxx9:x:1010:1010::/home/xxx9:/bin/bashxxx10:x:1011:1011::/home/xxx10:/bin/bashxxx11:x:1012:1012::/home/xxx11:/bin/bashxxx12:x:1013:1013::/home/xxx12:/bin/bashxxx13:x:1014:1014::/home/xxx13:/bin/bashxxx14:x:1015:1015::/home/xxx14:/bin/bashxxx15:x:1016:1016::/home/xxx15:/bin/bashxxx16:x:1017:1017::/home/xxx16:/bin/bashxxx17:x:1018:1018::/home/xxx17:/bin/bashxxx18:x:1019:1019::/home/xxx18:/bin/bashxxx19:x:1020:1020::/home/xxx19:/bin/bashxxx20:x:1021:1021::/home/xxx20:/bin/bashxxx21:x:1022:1022::/home/xxx21:/bin/bashxxx22:x:1023:1023::/home/xxx22:/bin/bashxxx23:x:1024:1024::/home/xxx23:/bin/bashxxx24:x:1025:1025::/home/xxx24:/bin/bashxxx25:x:1026:1026::/home/xxx25:/bin/bashxxx26:x:1027:1027::/home/xxx26:/bin/bashxxx27:x:1028:1028::/home/xxx27:/bin/bashxxx28:x:1029:1029::/home/xxx28:/bin/bashxxx29:x:1030:1030::/home/xxx29:/bin/bashxxx30:x:1031:1031::/home/xxx30:/bin/bashxxx31:x:1032:1032::/home/xxx31:/bin/bashxxx32:x:1033:1033::/home/xxx32:/bin/bashxxx33:x:1034:1034::/home/xxx33:/bin/bashxxx34:x:1035:1035::/home/xxx34:/bin/bashxxx35:x:1036:1036::/home/xxx35:/bin/bashxxx36:x:1037:1037::/home/xxx36:/bin/bashxxx37:x:1038:1038::/home/xxx37:/bin/bashxxx38:x:1039:1039::/home/xxx38:/bin/bashxxx39:x:1040:1040::/home/xxx39:/bin/bashxxx40:x:1041:1041::/home/xxx40:/bin/bashxxx41:x:1042:1042::/home/xxx41:/bin/bashxxx42:x:1043:1043::/home/xxx42:/bin/bashxxx43:x:1044:1044::/home/xxx43:/bin/bashxxx44:x:1045:1045::/home/xxx44:/bin/bashxxx45:x:1046:1046::/home/xxx45:/bin/bashxxx46:x:1047:1047::/home/xxx46:/bin/bashxxx47:x:1048:1048::/home/xxx47:/bin/bashxxx48:x:1049:1049::/home/xxx48:/bin/bashxxx49:x:1050:1050::/home/xxx49:/bin/bashxxx50:x:1051:1051::/home/xxx50:/bin/bashxxx51:x:1052:1052::/home/xxx51:/bin/bashxxx52:x:1053:1053::/home/xxx52:/bin/bashxxx53:x:1054:1054::/home/xxx53:/bin/bashxxx54:x:1055:1055::/home/xxx54:/bin/bashxxx55:x:1056:1056::/home/xxx55:/bin/bashxxx56:x:1057:1057::/home/xxx56:/bin/bashxxx57:x:1058:1058::/home/xxx57:/bin/bashxxx58:x:1059:1059::/home/xxx58:/bin/bashxxx59:x:1060:1060::/home/xxx59:/bin/bashxxx60:x:1061:1061::/home/xxx60:/bin/bashxxx61:x:1062:1062::/home/xxx61:/bin/bashxxx62:x:1063:1063::/home/xxx62:/bin/bashxxx63:x:1064:1064::/home/xxx63:/bin/bashxxx64:x:1065:1065::/home/xxx64:/bin/bashxxx65:x:1066:1066::/home/xxx65:/bin/bashxxx66:x:1067:1067::/home/xxx66:/bin/bashxxx67:x:1068:1068::/home/xxx67:/bin/bashxxx68:x:1069:1069::/home/xxx68:/bin/bashxxx69:x:1070:1070::/home/xxx69:/bin/bashxxx70:x:1071:1071::/home/xxx70:/bin/bashxxx71:x:1072:1072::/home/xxx71:/bin/bashxxx72:x:1073:1073::/home/xxx72:/bin/bashxxx73:x:1074:1074::/home/xxx73:/bin/bashxxx74:x:1075:1075::/home/xxx74:/bin/bashxxx75:x:1076:1076::/home/xxx75:/bin/bashxxx76:x:1077:1077::/home/xxx76:/bin/bashxxx77:x:1078:1078::/home/xxx77:/bin/bashxxx78:x:1079:1079::/home/xxx78:/bin/bashxxx79:x:1080:1080::/home/xxx79:/bin/bashxxx80:x:1081:1081::/home/xxx80:/bin/bashxxx81:x:1082:1082::/home/xxx81:/bin/bashxxx82:x:1083:1083::/home/xxx82:/bin/bashxxx83:x:1084:1084::/home/xxx83:/bin/bashxxx84:x:1085:1085::/home/xxx84:/bin/bashxxx85:x:1086:1086::/home/xxx85:/bin/bashxxx86:x:1087:1087::/home/xxx86:/bin/bashxxx87:x:1088:1088::/home/xxx87:/bin/bashxxx88:x:1089:1089::/home/xxx88:/bin/bashxxx89:x:1090:1090::/home/xxx89:/bin/bashxxx90:x:1091:1091::/home/xxx90:/bin/bashxxx91:x:1092:1092::/home/xxx91:/bin/bashxxx92:x:1093:1093::/home/xxx92:/bin/bashxxx93:x:1094:1094::/home/xxx93:/bin/bashxxx94:x:1095:1095::/home/xxx94:/bin/bashxxx95:x:1096:1096::/home/xxx95:/bin/bashxxx96:x:1097:1097::/home/xxx96:/bin/bashxxx97:x:1098:1098::/home/xxx97:/bin/bashxxx98:x:1099:1099::/home/xxx98:/bin/bashxxx99:x:1100:1100::/home/xxx99:/bin/bashxxx100:x:1101:1101::/home/xxx100:/bin/bash[root@localhost ]

批量添加用户还可以这样写

#!/bin/bash#批量添加指定数量的用户read -p "Please input user name: " -t 30 name#让用户输入用户名,把输入保存入变量nameread -p "Please input the number of users: " -t 30 num #让用户输入添加用户的数量,把输入保存入变量numread -p "Please input the password of users: " -t 30 pass#让用户输入初始密码,把输入保存如变量passif [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]#判断三个变量不为空theny=$(echo $num | sed 's/[0-9]//g')#定义变量的值为后续命令的结果#后续命令作用是,把变量num的值替换为空。如果能替换为空,证明num的值为数字#如果不能替换为空,证明num的值为非数字。我们使用这种方法判断变量num的值为数字if [ -z "$y" ]#如果变量y的值为空,证明num变量是数字thenfor (( i=1;i<=$num;i=i+1 ))#循环num变量指定的次数do /usr/sbin/useradd $name$i &>/dev/null#添加用户,用户名为变量name的值加变量i的数字echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null#给用户设定初始密码为变量pass的值chage -d 0 $name$i &>/dev/null#强制用户登录之后修改密码donefi fi

运行结果

[root@localhost ] vim b批量添加用户.sh[root@localhost ] chmod +x b批量添加用户.sh [root@localhost ] ./b批量添加用户.sh Please input user name: abcPlease input the number of users: 100Please input the password of users: 123456[root@localhost ] tail -n 100 /etc/passwdabc1:x:1102:1102::/home/abc1:/bin/bashabc2:x:1103:1103::/home/abc2:/bin/bashabc3:x:1104:1104::/home/abc3:/bin/bashabc4:x:1105:1105::/home/abc4:/bin/bashabc5:x:1106:1106::/home/abc5:/bin/bashabc6:x:1107:1107::/home/abc6:/bin/bashabc7:x:1108:1108::/home/abc7:/bin/bashabc8:x:1109:1109::/home/abc8:/bin/bashabc9:x:1110:1110::/home/abc9:/bin/bashabc10:x:1111:1111::/home/abc10:/bin/bashabc11:x:1112:1112::/home/abc11:/bin/bashabc12:x:1113:1113::/home/abc12:/bin/bashabc13:x:1114:1114::/home/abc13:/bin/bashabc14:x:1115:1115::/home/abc14:/bin/bashabc15:x:1116:1116::/home/abc15:/bin/bashabc16:x:1117:1117::/home/abc16:/bin/bashabc17:x:1118:1118::/home/abc17:/bin/bashabc18:x:1119:1119::/home/abc18:/bin/bashabc19:x:1120:1120::/home/abc19:/bin/bashabc20:x:1121:1121::/home/abc20:/bin/bashabc21:x:1122:1122::/home/abc21:/bin/bashabc22:x:1123:1123::/home/abc22:/bin/bashabc23:x:1124:1124::/home/abc23:/bin/bashabc24:x:1125:1125::/home/abc24:/bin/bashabc25:x:1126:1126::/home/abc25:/bin/bashabc26:x:1127:1127::/home/abc26:/bin/bashabc27:x:1128:1128::/home/abc27:/bin/bashabc28:x:1129:1129::/home/abc28:/bin/bashabc29:x:1130:1130::/home/abc29:/bin/bashabc30:x:1131:1131::/home/abc30:/bin/bashabc31:x:1132:1132::/home/abc31:/bin/bashabc32:x:1133:1133::/home/abc32:/bin/bashabc33:x:1134:1134::/home/abc33:/bin/bashabc34:x:1135:1135::/home/abc34:/bin/bashabc35:x:1136:1136::/home/abc35:/bin/bashabc36:x:1137:1137::/home/abc36:/bin/bashabc37:x:1138:1138::/home/abc37:/bin/bashabc38:x:1139:1139::/home/abc38:/bin/bashabc39:x:1140:1140::/home/abc39:/bin/bashabc40:x:1141:1141::/home/abc40:/bin/bashabc41:x:1142:1142::/home/abc41:/bin/bashabc42:x:1143:1143::/home/abc42:/bin/bashabc43:x:1144:1144::/home/abc43:/bin/bashabc44:x:1145:1145::/home/abc44:/bin/bashabc45:x:1146:1146::/home/abc45:/bin/bashabc46:x:1147:1147::/home/abc46:/bin/bashabc47:x:1148:1148::/home/abc47:/bin/bashabc48:x:1149:1149::/home/abc48:/bin/bashabc49:x:1150:1150::/home/abc49:/bin/bashabc50:x:1151:1151::/home/abc50:/bin/bashabc51:x:1152:1152::/home/abc51:/bin/bashabc52:x:1153:1153::/home/abc52:/bin/bashabc53:x:1154:1154::/home/abc53:/bin/bashabc54:x:1155:1155::/home/abc54:/bin/bashabc55:x:1156:1156::/home/abc55:/bin/bashabc56:x:1157:1157::/home/abc56:/bin/bashabc57:x:1158:1158::/home/abc57:/bin/bashabc58:x:1159:1159::/home/abc58:/bin/bashabc59:x:1160:1160::/home/abc59:/bin/bashabc60:x:1161:1161::/home/abc60:/bin/bashabc61:x:1162:1162::/home/abc61:/bin/bashabc62:x:1163:1163::/home/abc62:/bin/bashabc63:x:1164:1164::/home/abc63:/bin/bashabc64:x:1165:1165::/home/abc64:/bin/bashabc65:x:1166:1166::/home/abc65:/bin/bashabc66:x:1167:1167::/home/abc66:/bin/bashabc67:x:1168:1168::/home/abc67:/bin/bashabc68:x:1169:1169::/home/abc68:/bin/bashabc69:x:1170:1170::/home/abc69:/bin/bashabc70:x:1171:1171::/home/abc70:/bin/bashabc71:x:1172:1172::/home/abc71:/bin/bashabc72:x:1173:1173::/home/abc72:/bin/bashabc73:x:1174:1174::/home/abc73:/bin/bashabc74:x:1175:1175::/home/abc74:/bin/bashabc75:x:1176:1176::/home/abc75:/bin/bashabc76:x:1177:1177::/home/abc76:/bin/bashabc77:x:1178:1178::/home/abc77:/bin/bashabc78:x:1179:1179::/home/abc78:/bin/bashabc79:x:1180:1180::/home/abc79:/bin/bashabc80:x:1181:1181::/home/abc80:/bin/bashabc81:x:1182:1182::/home/abc81:/bin/bashabc82:x:1183:1183::/home/abc82:/bin/bashabc83:x:1184:1184::/home/abc83:/bin/bashabc84:x:1185:1185::/home/abc84:/bin/bashabc85:x:1186:1186::/home/abc85:/bin/bashabc86:x:1187:1187::/home/abc86:/bin/bashabc87:x:1188:1188::/home/abc87:/bin/bashabc88:x:1189:1189::/home/abc88:/bin/bashabc89:x:1190:1190::/home/abc89:/bin/bashabc90:x:1191:1191::/home/abc90:/bin/bashabc91:x:1192:1192::/home/abc91:/bin/bashabc92:x:1193:1193::/home/abc92:/bin/bashabc93:x:1194:1194::/home/abc93:/bin/bashabc94:x:1195:1195::/home/abc94:/bin/bashabc95:x:1196:1196::/home/abc95:/bin/bashabc96:x:1197:1197::/home/abc96:/bin/bashabc97:x:1198:1198::/home/abc97:/bin/bashabc98:x:1199:1199::/home/abc98:/bin/bashabc99:x:1200:1200::/home/abc99:/bin/bashabc100:x:1201:1201::/home/abc100:/bin/bash[root@localhost ]

18、批量删除用户

#!/bin/bashname=$( cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1)for i in $namedouserdel -r $i &>/dev/nulldone

运行结果

[root@localhost ] vim 批量删除用户.sh[root@localhost ] chmod +x 批量删除用户.sh [root@localhost ] ./批量删除用户.sh [root@localhost ][root@localhost ] tail -n 100 /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:999:998:User for polkitd:/:/sbin/nologinsssd:x:998:995:User for sssd:/:/sbin/nologinlibstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologincolord:x:996:993:User for colord:/var/lib/colord:/sbin/nologinrpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologingluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologinsaslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologinabrt:x:173:173::/etc/abrt:/sbin/nologinsetroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologinrtkit:x:172:172:RealtimeKit:/proc:/sbin/nologinradvd:x:75:75:radvd user:/:/sbin/nologinchrony:x:992:989::/var/lib/chrony:/sbin/nologinqemu:x:107:107:qemu user:/:/sbin/nologinunbound:x:991:988:Unbound DNS resolver:/etc/unbound:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologinusbmuxd:x:113:113:usbmuxd user:/:/sbin/nologingeoclue:x:990:986:User for geoclue:/var/lib/geoclue:/sbin/nologinpulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologingdm:x:42:42::/var/lib/gdm:/sbin/nologinsaned:x:989:983:SANE scanner daemon user:/usr/share/sane:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologingnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinavahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinmysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin[root@localhost ]

看到了吗,除了系统用户之外,我创建的个人登录账号以及刚才新建的200测试账号全部删除了,是否全部删除干净呢?让我们看看这六个文件就知道了

[root@localhost ~] tail -n 5 /etc/shadow #用户加密文件sshd:!!:19095::::::avahi:!!:19095::::::postfix:!!:19095::::::tcpdump:!!:19095::::::mysql:!!:19111::::::[root@localhost ~] tail -n 5 /etc/group #用户组文件stapusr:x:156:stapsys:x:157:stapdev:x:158:tcpdump:x:72:mysql:x:27:[root@localhost ~] tail -n 5 /etc/gshadow #用户组的加密文件stapusr:!::stapsys:!::stapdev:!::tcpdump:!::mysql:!::[root@localhost ~] tail -n 5 /etc/passwd #用户密码存放文件sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinavahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinmysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin[root@localhost ~] ll /home/ #用户家目录总用量 0[root@localhost ~] ll /var/spool/mail/ #用户邮箱总用量 76-rw-------. 1 root mail 74507 4月 17 10:05 root-rw-rw----. 1 rpc mail0 4月 13 11:29 rpc[root@localhost ~] 可以看到这六个文件里的用户文件是已经清除干净了的

五、结尾

首先恭喜您的shell脚本技术又往前迈进了一大步,我相信看完这些,也能对linux的shell编程有了更深一层的了解,但这远远还是不够的,多敲多理解,模板是固定的、我们的思维是活跃的,不能单单只局限于学习这点知识,多向外延伸。这篇文章当中有很多shell脚本例子,都很实用!

这一篇文章学到这里就算结束了,统计了一下加上代码大概5万四千多字,熬夜奋战了一个多星期,总算写完了,不知道学到这里您是否有收获呢?收获肯定是不少的,这篇文章算是全网最丰富最全的shell脚本之一了,最后希望都能够有所收获,学习shell其实并不难,把文章中的所有程序例子照着写三步大致就能学会了,第一步又分为三遍:第一遍没什么技巧,照着抄并且能够实现功能就行;第二遍把注释都删掉,手工往里添加注释;第三遍把程序都删掉,留着注释,照着注释写程序代码。第二步也就是在程序代码的基础上增加一些功能,并且能够实现;第三步多默写几遍。做到这三步,那么又再次恭喜您,算是学会了,以后遇到shell脚本的相关语言一条命令就i能实现,哈哈加油!

如果本文对您有一点点帮助,可以点赞、关注、收藏一下吧

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。