设为首页 收藏本站
查看: 957|回复: 0

shell脚本基础知识(下)

[复制链接]

尚未签到

发表于 2018-8-29 09:01:23 | 显示全部楼层 |阅读模式
  七、shell中的case判断
  格式: case  变量名 in
  value1)
  command
  ;;
  value2)
  command
  ;;
  *)
  commond
  ;;
  esac
  在case程序中,可以在条件中使用|,表示或的意思, 比如:
  2|3)
  command
  ;;
  当变量为2或者3时,执行该部分命令。
  应用举例:
[  
root@hpf-linux
  
shell]# cat test7.sh
  
#!/bin/bash
  
read -p "请输入学生的成绩: " num
  
n1=`echo $num | sed 's/[0-9]//g'`         //判断是否为数字
  
if [ ! -z $n1 ]
  
then
  
    echo "这不是一个数字请从新输入!!"
  
exit 1
  
fi
  
if  [[ $num -gt 100 || $num -lt 0 ]]
  
then
  
    echo  "学生的成绩为0-100,请从新输入!"
  
exit 1
  
elif [ $num -ge 90 ] && [ $num -le 100 ]
  
then
  
    tag=1
  
elif [ $num -ge 80 ] && [ $num -le 90 ]
  
then
  
    tag=2
  
elif [ $num -ge 70 ] && [ $num -le 80 ]
  
then
  
    tag=3
  
elif [ $num -ge 60 ] && [ $num -le 70 ]
  
then
  
    tag=4
  
else
  
    tag=5
  
fi
  
case $tag in
  
     1)
  
echo "优秀!"
  
;;
  
     2)
  
echo "良好!"
  
;;
  
     3)
  
echo "中等!"
  
;;
  
     4)
  
echo "万岁!及格啦!"
  
;;
  
     5)
  
echo "抱歉!你不及格!还需要补考!"
  
;;
  
esac
  
[
  
root@hpf-linux
  
shell]# sh test7.sh
  
请输入学生的成绩: 111
  
学生的成绩为0-100,请从新输入!
  
[
  
root@hpf-linux
  
shell]# sh test7.sh
  
请输入学生的成绩: dagfag
  
这不是一个数字请从新输入!!
  
[
  
root@hpf-linux
  
shell]# sh test7.sh
  
请输入学生的成绩: 89
  
良好!
  通过上例可以看到case判断的使用,虽然例子不是很好,但是比较全面的练习了if和case语句,在编写时由于自己的马虎在判断句if [ ! -z $n1 ]中-z少写了- 导致出现了错误,请大家引以为戒!
  八、shell脚本中的循环
  1、for循环
  语法结构: for  变量名 in 条件; do … done ;
  应用举例:
[  
root@hpf-linux
  
shell]# cat test8.sh
  
#!/bin/bash
  
read -p "请输入一个数字:" n
  
n1=`echo $n | sed 's/[0-9]//g'`
  
if [  ! -z $n1  ]
  
then   echo "请输入数字!"
  
       exit 1
  
fi
  
sum=0
  
for i in `seq  1 $n`
  
do
  
   sum=$(($i+$sum))
  
done
  
   echo $sum
[  
root@hpf-linux
  
shell]# sh test8.sh -x
  
请输入一个数字:10
  
55
  
[
  
root@hpf-linux
  
shell]# sh test8.sh -x
  
请输入一个数字:999
  
499500
  
[
  
root@hpf-linux
  
shell]# sh test8.sh -x
  
请输入一个数字:99999
  
4999950000
  
[
  
root@hpf-linux
  
shell]# sh test8.sh -x
  
请输入一个数字:5645757
  
15937288874403
  上例为手动输入一个数计算其从0加到本身所得的总和并输出,在加最后一个数时CPU运算了二十多秒,所以没事还是不要这样玩。
  2、while 循环
  语法结构: while 条件; do … done 死循环用 : 表示 ;
  break直接结束本层循环; continue忽略continue之下的代码,直接进行下一次循环 ;
  exit 直接退出shell ;
  应用举例:
[  
root@hpf-linux
  
shell]# cat test9.sh
  
#/bin/bash
  
while :
  
do
  
   load=`w|awk -F 'load average: ' '{print$2}'|cut -d. -f1`
  
   processor=`cat /proc/cpuinfo | grep 'processor' | wc -l`
  
   if [ $load -lt $processor ]      //注意为了能收到邮件我写成小于,在长使用是用大于的
  
      then
  
top -bn1|mail -s " load is high: $load"  XXXX
  
@126.com
  

  
   else
  
exit 0
  
   fi
  
sleep 30
  
done
  上例是一个简单的判断服务器是否过载,若过载则将信息发送给126邮箱,并且是30秒一封,这个例子是简单的通过脚本监控系统的负载,若要更好的监控还是建议使用专业的监控软件cacti/nagios/zabbix等工具。
[  
root@hpf-linux
  
shell]# cat test9.sh
  
#/bin/bash
  
while :
  
do
  
   load=`w|awk -F 'load average: ' '{print$2}'|cut -d. -f1`
  
   processor=`cat /proc/cpuinfo | grep 'processor' | wc -l`
  
   if [ $load -lt $processor ]      //注意为了能收到邮件我写成小于,在长使用是用大于的
  
      then
  
top -bn1|mail -s " load is high: $load"  XXXX
  
@126.com
  

  
   else
  
exit 0
  
   fi
  
sleep 30
  
done
  上例是简单的介绍使用在while语句中用同continue和break跳出循环的区别,简单的讲:
  break :结束并退出循环 。
  continue :在循环中不执行continue下面的代码,转而进入下一轮循环
  exit :退出脚本, 常带一个整数给系统,如 exit 0
  return :在函数中将数据返回,或返回一个结果给调用函数的脚本
  九、shell函数
  1、shell函数简介
  shell一个非常重要的特性是它可作为一种编程语言来使用。因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
  2、shell函数语法
  函数由两部分组成:函数标题、函数体。
  标题是函数名。函数体是函数内的命令集合。标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用相应的s h e l l。
  定义函数的格式为:
  函数名()
  {
  命令1
  . . .
  }
  或者
  函数名(){
  命令1
  . . .
  }
  两者方式都可行。如果愿意,可在函数名前加上关键字f u n c t i o n,这取决于使用者。
  f u n c t i o n 函数名()
  { ...
  }
  可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前s h e l l和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的 s h e l l,因而去除所有原脚本中定义的存在变量。 函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。函数不必包含很多语句或命令,甚至可以只包含一个e c h o语句,这取决于使用者。参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
  3、shell函数应用举例
  查看ip地址的函数;输入一个网卡名,输出网卡对应的ip地址;
[  
root@hpf-linux
  
shell]# cat fun1.sh
  
#/bin/bash
  
read -p "请输入网卡:" network
  
ip ()
  
{
  
    ifconfig $network|head -2|tail -1|awk -F ':' '{print$2}'|awk '{print$1}'
  
}
  
case $network in
  
    eth*)
  
        echo "这是Ethernet网卡,"
  
        ipaddr=`ip $network`
  
        echo "$network的IP是:$ipaddr"
  
        ;;
  
      lo)
  
        echo "这是回环网卡"
  
        ipaddr=`ip $network`
  
        echo "$network的IP是:$ipaddr"
  
        ;;
  
       *)
  
        echo "你输入的不正确,请从新输入!"
  
        ;;
  
esac
  扩展学习:
  select也是循环的一种,它比较适合用在用户选择的情况下。
  比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。
#!/bin/bash  
PS3="Please select a number: "
  
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
  
echo
  
select command in w top free quit
  
do
  
    case $command in
  
    w)
  
        w
  
        ;;
  
    top)
  
        top
  
        ;;
  
    free)
  
        free
  
        ;;
  
    quit)
  
        exit
  
        ;;
  
    *)
  
        echo "Please input a number:(1-4)."
  
    esac
  
done
[root@hpf-linuxshell]# sh select1.sh  
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit
  
1) w
  
2) top
  
3) free
  
4) quit
  
Please select a number: 1
  
09:34:03 up  9:39,  2 users,  load average: 0.00, 0.00, 0.00
  
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
  
root     pts/0    192.168.1.104    00:22    0.00s  0.25s  0.00s sh select1.sh
  
root     pts/1    192.168.1.104    01:24   14:18   0.36s  0.36s -bash
  
Please select a number: 4
  文件测试
  单目测试:
  -e file :测试文件是否存在
  -a file :测试文件是否存在
  -f file: 测试是否为普通文件
  -d 目录: 测试是否为目录文件
  -b somefile : 测试文件是否存在并且是否为一个块设备文件
  -c somefile : 测试文件是否存在并且是否为一个字符设备文件
  -h|-L somefile : 测试文件是否存在并且是否为符号链接文件
  -p somefile : 测试文件是否存在并且是否为管道文件:
  -S somefile : 测试文件是否存在并且是否为套接字文件:
  -r somefile:  测试其有效用户是否对此文件有读取权限
  -w somefile:  测试其有效用户是否对此文件有写权限
  -x somefile:  测试其有效用户是否对此文件有执行权限
  -s somefile:  测试文件是否存在并且不空
  双目测试:
  file1 -nt file2 :测试file1是否比file2更 新一些
  file1 -ot file2 :测试file1是否比file2更 老一些
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557970-1-1.html 上篇帖子: shell脚本基础知识(上) 下篇帖子: 对nginx的日志进行分割的shell脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表