当前位置:   article > 正文

Linux学习Shell Scripts(脚本)_深度学习 scripts shell

深度学习 scripts shell

 

→点击返回原文

声明:

Shell Scripts是个自动管理系统软件的好工具,它可以简化我们日常工作管理,入侵检测呀,数据处理呀,而且很多服务都可以利用到它。它跨平台支持且学习历程短(不像程序语言那么难学哦)。

 

Contend

一、简单入门(介绍,实例)

二、善用判断式

三、条件判断式 if……then

四、循环(loop)

五、脚本的调试(debug)

六、shell脚本学习总结

 


一、简单入门(介绍,实例)

1.1 shell script其实就是一个文档(里面包含很多的命令,有简单的格式,一行一行的执行),可以直接用vim编辑(vim很适合写脚本哦)。

现在我们假设你写的这个程序文件名是/home/dmtsai/shell.sh 好了,那如何执行这个文件?

(1)直接指令下达:shell.sh 文件必须要具备可读与可执行(rx) 的权限,然后:

  • 绝对路径:使用/home/dmtsai/shell.sh 来下达指令;
  • 相对路径:假设工作目录在/home/dmtsai/ ,则使用 ./shell.sh 来执行;
  • 变量「PATH」功能:将shell.sh 放在PATH指定的目录内,例如: ~/bin/

(2)以bash 程序来执行:透过「bash shellsh」或「sh shell.sh」来执行

(3)利用sh参数如-n及-x来检查shell脚本语法是否正确。

1.2 简单创建一个输出hello world脚本。(首先我们就要养成良好的编写脚本习惯,多写注释!

  • 第一行#!/bin/bash 说明这是一个脚本文件,必须写的哦;
  • 其它注释说明这个文件的功能,时间,作者,版本,历史记录(建议每次写脚本都注明下,方便以后改写呢;
  • PATH这行宣告变量也极其重要,这样可以让我们程序直接下达一些外部指令,为了方便啦;
  • echo那行就是主要部分了;
  • 最后exit 0表示执行成果告知(定义返回值)

最后直接执行这个文件就可以了

  1. [user1@agent ~]$ mkdir bin;cd bin
  2. [user1@agent bin]$ vim hello.sh
  3. #!/bin/bash
  4. #program :show "hello world" in your screen
  5. #history
  6. #date:2020/03/30 Jack CentOS7.3 1297824292
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9. echo -e "hello world!"
  10. exit 0
  11. [user1@agent bin]$ sh hello.sh

1.3 再来操作一个,在屏幕输出你的名字(程序取用你输入的变量)

注意理解脚本的意思呀:read -p就是让你输入,后面firstname就是获取变量,没有C语言复杂吧,最后echo -e输出,不过注意后面的形式,刚开始模仿就好了,慢慢就理解啦,不要一开始就放弃哦)

  1. [user1@agent bin]$ vim showname.sh
  2. #!/bin/bash
  3. #program :
  4. #date:2020/03/30 Jack CentOS7.3 1297824292
  5. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  6. export PATH
  7. read -p "Please input your first name:" firstname
  8. read -p "Please input your last name:" lastname
  9. echo -e "\nYour full name is :${firstname}${lastname}"
  10. [user1@agent bin]$ sh showname.sh
  11. [user1@agent bin]$ sh showname.sh
  12. Please input your first name:Jack
  13. Please input your last name:chen
  14. Your full name is :Jackchen

 

1.4 come on,再来一个,利用date实现对数据库文件的备份(这样就不用每次就修改文件,脚本啦)

1.5 实现简单的加减乘除     var=$((运算内容))

  1. user1@agent bin]$ vim mutiply.sh
  2. #!/bash/bin
  3. #function:加减运算
  4. #date 2020/03/30 author telephone
  5. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  6. export PATH
  7. read -p "Please input your first number:" firstnu
  8. read -p "Please input your last number:" lastnu
  9. total=$((${firstnu}*${lastnu}))
  10. echo -e "the result of $firstnu * $lastnu = ${total}"
  11. [user1@agent bin]$ sh mutiply.sh
  12. Please input your first number:23
  13. Please input your last number:23
  14. the result of 23 * 23 = 529

计算有小数点的数据可借助bc这个指令,就是计算器哦,例如:

  1. [user1@agent bin]$ echo "123.23*23.23" | bc
  2. 2862.63

然后我们计算pi的值(那个4*a(1)是bc主动提供的一个计算pi 的函数,至于scale 就是要bc计算几个小数点下位数的意思。当scale 的数值越大,代表 pi要被计算的越精确,当然用掉的时间就会越多)

1.6 source执行脚本和前面几种执行方式有差别。看下面的变量就知道了吧(用source可以将变量传送过来)

  1. [user1@agent bin]$ sh showname.sh
  2. Please input your first name:Jack
  3. Please input your last name:chen
  4. Your full name is :Jackchen
  5. [user1@agent bin]$ echo $PATH
  6. [user1@agent bin]$ source showname.sh
  7. Please input your first name:JACK
  8. Please input your last name:CHEN
  9. Your full name is :JACKCHEN
  10. [user1@agent bin]$ echo $PATH
  11. /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/user1/bin

二、善用判断式

2.1 test指令测试:

判断是否存在这个目录,有就输出“exist”,没有就输出“not exist”

  1. [user1@agent ~]$ test -e /user1 && echo "exist" || echo "not exist"
  2. not exist

复习一下这个指令下达情况呀:

test具体的参数:(大家可以man一下看看就不用记那么多了,大概了解一些常用的就行)

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. #1 让用户输入档名,判断是否输入
  7. echo -e "please input a filename,I will check the filename's type and permission.\n"
  8. read -p "input a filename :" filename
  9. test -z ${filename} && echo "You must input a filename." && exit 0
  10. #2.判断文件是否存在?若不存在则显示信息并结束脚本
  11. test ! -e ${filename} && echo "The filename '${filename}' don't exist" && exit 0
  12. #3.判断文件类型和属性
  13. test -f ${filename} && filetype="regular file"
  14. test -d ${filename} && filetype="directory"
  15. test -r ${filename} && perm="readable"
  16. test -w ${filename} && perm="${perm} writable"
  17. test -x ${filename} && perm="excutable"
  18. #4.print info
  19. echo "the filename:${filename} is a ${filetype}"
  20. echo "And the permission for you is : ${perm}"

2.2 还有个判断符号【】,看一下他们两效果是一样的。

  1. [user1@agent bin]$ [ -z "${HOME}" ];echo $?
  2. 1
  3. [user1@agent bin]$ test -z ${HOME};echo $?
  4. 1

2.3 shell script的默认变数

  1. #用file查询这是一个可执行的脚本哦
  2. [user1@agent bin]$ file /etc/init.d/network
  3. /etc/init.d/network: Bourne-Again shell script, ASCII text executable
  4. #这样可以重启网络
  5. [user1@agent bin]$ /etc/init.d/network restart
  6. #类似于下面两个都可以,我们到服务器会讲
  7. [user1@agent bin]$ systemctl restart network
  8. [user1@agent bin]$ service network restart

三、条件判断式 if……then

(1)格式如下:

 

(2)看个简单的实例(好好观察他们的格式呀,熟悉熟悉)

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. read -p "please input (Y/N):" yn
  7. if [ "${yn}" = "y" ] || [ "${yn}" = "Y" ]; then
  8. echo "ok,continue"
  9. exit 0
  10. fi
  11. if [ "${yn}" = "n" ] || [ "${yn}" = "N" ]; then
  12. echo "oh, interrupt"
  13. exit 0
  14. fi
  15. echo "I don't know what your choice is" && exit 0

咱么让程序更简单明了一点:

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. read -p "please input (Y/N):" yn
  7. if [ "${yn}" = "y" ] || [ "${yn}" = "Y" ]; then
  8. echo "ok,continue"
  9. exit 0
  10. elif [ "${yn}" = "n" ] || [ "${yn}" = "N" ]; then
  11. echo "oh, interrupt"
  12. exit 0
  13. else
  14. echo "I don't knoe what your choice is" && exit 0
  15. fi

(3)下面这个例子很有意思哦,grep过滤命令应该知道了把,我们编写netstat一个脚本去检测主机是否开启服务端口

虽然很长,但几乎都一样的。自己尝试下。

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. #告知
  7. echo "now,I will detect your linux server's services!"
  8. echo -e "The www,ftp,ssh,and mail(smtp) will be detect!\n"
  9. #start detecting! and echo some info
  10. testfile=/dev/shm/netstat_checking.txt
  11. netstat -tuln > ${testfile}
  12. #先侦查,再判断
  13. testing=$(grep ":80" ${testfile})
  14. if [ "${testing}" != "" ];then
  15. echo "www is running in your system."
  16. else echo "www is not running"
  17. fi
  18. testing=$(grep ":22" ${testfile})
  19. if [ "${testing}" != "" ];then
  20. echo "ssh is running in your system."
  21. else echo "ssh is not running"
  22. fi
  23. testing=$(grep ":21" ${testfile})
  24. if [ "${testing}" != "" ];then
  25. echo "ftp is running in your system."
  26. else echo "ftp is not running"
  27. fi
  28. testing=$(grep ":25" ${testfile})
  29. if [ "${testing}" != "" ];then
  30. echo "mail is running in your system."
  31. else echo "mail is not running"
  32. fi

四、循环(loop)

(1)while do done,until do done(不定循环)

当条件成立时,就进行循环,条件不成立就停止了。

看个例子,计算1+2+3+……+100的值,有助于我们了解。

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. s=0
  7. i=0
  8. while [ "${i}" != 100 ]
  9. do
  10. i=$(($i+1))
  11. s=$(($s+$i))
  12. done
  13. echo "the result of '1+2+3+...+100' is => $s"

下面这个相反,当条件成立时就终止循环,否则持续。(这个我就不举例子了)

(2)for...do...done(固定循环)

看个例子(for循环和if判断一起用的例子->侦查192.168.1.1~192.168.1.100的主机 )

(3)for...do...done的数值处理(这个就很接近我们所学的C语言的for循环格式啦)

举个栗子:注意格式,我想大家都知道这个脚本的含义咯。

(4)再看一个非常有意思的脚本,这个搭配随机数和数组咯(利用这个告诉我们今天该吃什么)

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. #输入选择
  7. eat[1]="麦当劳汉堡"
  8. eat[2]="肯德鸡炸鸡"
  9. eat[3]="日式便当"
  10. eat[4]="黄焖鸡"
  11. eat[5]="大排面"
  12. eat[6]="脆皮鸡饭"
  13. eat[7]="蛋包饭"
  14. eat[8]="吃泡面趴"
  15. eat[9]="各自点外卖趴"
  16. #需要输入几个有用的餐厅数
  17. eatnum=9
  18. #RANDOM随机生成0 - 32767之间的整数.
  19. check=$(( ${RANDOM} *${eatnum} / 32767 +1 ))
  20. echo "you may eat ${eat[${check}]}"

 进阶版(输出三个吃的选择)

  1. #!/bin/bash
  2. #program :
  3. #date:2020/03/30 Jack CentOS7.3 1297824292
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  5. export PATH
  6. #输入选择
  7. eat[1]="麦当劳汉堡"
  8. eat[2]="肯德鸡炸鸡"
  9. eat[3]="日式便当"
  10. eat[4]="黄焖鸡"
  11. eat[5]="大排面"
  12. eat[6]="脆皮鸡饭"
  13. eat[7]="蛋包饭"
  14. eat[8]="吃泡面趴"
  15. eat[9]="各自点外卖趴"
  16. #需要输入几个有用的餐厅数
  17. eatnum=9 #定义变量${eatnum}为9,即输入有几个可用的餐厅数
  18. eated=0 #定义变量${eated}为0
  19. while [ "${eated}" -lt 3 ]; do #${eated}小于3时即循环
  20. check=$(( ${RANDOM}*${eatnum}/32767 + 1 ))
  21. mycheck=0
  22. if [ "${eated}" -ge 1 ]; then #判断${eated}是否大于等于1
  23. for i in $(seq 1 ${eated}) #对于1-${eated}的连续的几个数
  24. do
  25. if [ ${eatedcon[$i]} == $check ]; then
  26. mycheck=1
  27. fi
  28. done
  29. fi
  30. if [ ${mycheck} == 0 ]; then
  31. echo "you may eat ${eat[${check}]}"
  32. eated=$(( ${eated} + 1 ))
  33. eatedcon[${eated}]=${check}
  34. fi
  35. done

五、脚本的调试(debug)

(1)用bash加参数进行检测调试

  1. #常用就是-n这个参数,检查语法有没有问题,没有输出就是OK的
  2. [user1@agent bin]$ sh -n random_eat1.sh
  3. #-x检测脚本执行过程
  4. [user1@agent bin]$ sh -x random_eat1.sh
  5. + PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/user1/bin
  6. + export PATH
  7. + eat[1]=麦当劳汉堡
  8. + eat[2]=肯德鸡炸鸡
  9. + eat[3]=日式便当
  10. + eat[4]=黄焖鸡
  11. + eat[5]=大排面
  12. + eat[6]=脆皮鸡饭
  13. + eat[7]=蛋包饭
  14. + eat[8]=吃泡面趴
  15. + eat[9]=各自点外卖趴
  16. + eatnum=9
  17. + check=8
  18. + echo 'you may eat 吃泡面趴'
  19. you may eat 吃泡面趴

六、shell脚本学习总结

我们已经基本了解了shell基本的基本用法啦,实际工作中,现在网上有很多已经开发开放的脚本,我们就可以直接拿来修改来改成适合自己的主机的脚本咯(前提我们要看懂别人的脚本含义哦)。还有我们所学习sh检测方法至关重要哦,熟悉sh用法让你运用脚本更得心应手。遇到看不懂的脚本语句百度就能解决啦!记住学好学快脚本的方式就是多看,多模仿,并加以修改成自己的样式!

最后给大家奉上一个zabbix安装的脚本,有兴趣可以去观察模仿下哦!

——>点击访问zabbix安装脚本

如果各位学到一点知识的话可以点个赞哦,下面我会再写一些服务器安装脚本,LAMP部署脚本啥的哈声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】

推荐阅读
相关标签