将后缀名为 .txt 的文件改成 .log

  1. [root@k8s-master test]# touch localhost_2020-01-{02..26}.txt
  2. [root@k8s-master test]# ll
  3. total 0
  4. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-02.txt
  5. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-03.txt
  6. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-04.txt
  7. # 此例中, ${filename//\.txt/\.log} 或 ${filename/\.txt/\.log} 都可以,如果变量名中有多个 .txt,前者全部替换,后者只替换第一个
  8. [root@k8s-master test]# for filename in `ls ./`;do mv $filename ${filename//\.txt/\.log};done
  9. [root@k8s-master test]# ll
  10. total 0
  11. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-02.log
  12. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-03.log
  13. -rw-r--r-- 1 root root 0 Aug 27 16:26 localhost_2020-01-04.log

输入一个用户,判断 Linux 系统中是否存在此用户

  1. [root@k8s-master 827]# cat check_user.sh
  2. #!/bin/bash
  3. read -p "Check username is or not exist : " username
  4. grep -e "^$username\:" /etc/passwd >/dev/null
  5. if [ $? -eq 0 ];then
  6. echo "Yes! It's exist!"
  7. else
  8. echo "No ! It's not exist"
  9. fi

猜年龄,年龄是整形数字

  1. [root@k8s-master 827]# cat guess_age.sh
  2. #!/bin/bash
  3. correct_age=18
  4. # 检查是否输入一个位置参数
  5. [ $# -ne 1 ] && echo "Please Input One Argument ~~~ " && exit
  6. # 检查参数是否是数字
  7. [[ ! $1 =~ ^[0-9]+$ ]] && echo "Argument Must Be Integer ~~~ " && exit
  8. # 判断是否正确
  9. if [ $1 -eq $correct_age ];then
  10. echo "Congratulation ~~~"
  11. elif [ $1 -gt $correct_age ];then
  12. echo "Greater Than Correct Resault !!! "
  13. elif [ $1 -lt $correct_age ];then
  14. echo "Less Than Correct Resault !!! "
  15. fi

监控磁盘和内存的使用情况

  1. [root@k8s-master 827]# cat monitor.sh
  2. #!/bin/bash
  3. # 获取磁盘已使用量
  4. disk_use=`df | grep '/$' | awk '{print $5}' | cut -d% -f1`
  5. # 获取内存总量,内存空闲
  6. mem_total=`free -m | grep "Mem" | awk '{print $2}'`
  7. mem_free=`free -m | grep "Mem" | awk '{print $4}'`
  8. # 获取内存空闲百分比
  9. mem_free_percent=$(echo "scale=2;$mem_free/$mem_total" | bc | cut -d. -f2)
  10. # 磁盘用量大于 80% 时,发送邮件提醒
  11. if [ $disk_use -gt 80 ];then
  12. echo "磁盘使用${disk_use}%,清理下磁盘吧 ~~~" | mail -s "Warning,Check Your Disk Status" xxxx@126.com
  13. fi
  14. # 内存用量大于 80% 时,发送邮件提醒
  15. if [ $mem_free_percent -lt 20 ];then
  16. echo "内存剩余${mem_free_percent}%, 内存不够用了 ~~~" | mail -s "Warning,Check Your Memory Status" xxxx@126.com
  17. fi

写一个脚本,模拟 Nginx 服务启动等操作

  1. [root@k8s-master 827]# cat nginx.sh
  2. #!/bin/bash
  3. . /etc/init.d/functions
  4. # 需要定义一个全局变量,位置参数无法传递到函数体内
  5. arg=$1
  6. # 判断执行命令是否成功,并给出响应结果
  7. function check(){
  8. systemctl $1 nginx &>/dev/null
  9. [ $? -eq 0 ] && action "Nginx $arg is" true || action "Nginx $arg is" false
  10. }
  11. # 判断是否传入一个位置参数
  12. [ $# -ne 1 ] && echo -e "Usage: $0 { start | restart | stop | reload | status } " && exit
  13. # 根据传入的位置参数 选择执行命令
  14. case $1 in
  15. "start")
  16. # 检查是否已经启动
  17. netstat -an | grep '\bLISTEN\b' | grep '\b80\b' &>/dev/null
  18. if [ $? -eq 0 ];then
  19. action "Nginx is already started" true
  20. else
  21. check
  22. fi
  23. ;;
  24. "restart")
  25. check
  26. ;;
  27. "status")
  28. check
  29. ;;
  30. "stop")
  31. check
  32. ;;
  33. "reload")
  34. check
  35. ;;
  36. *)
  37. echo -e "Usage: $0 { start | restart | stop | reload | status } "
  38. esac

判断数字是否是整型

  1. [root@k8s-master 826]# cat isint.sh
  2. #!/bin/bash
  3. # 获取用户终端输入
  4. read -p "Please Input Your Number:" number
  5. # 判断输入是否是整型
  6. expr $number + 0 &>/dev/null
  7. [ $? -eq 0 ] && echo "Type Int!" || echo "SHIT!!"

测试传入的 IP 地址能否 PING 通

  1. [root@k8s-master 826]# cat ping.sh
  2. #!/bin/bash
  3. # 循环获取所有的位置参数
  4. for i in "$@"
  5. do
  6. # 在 子shell 中运行,并放到后台,可以脚本并发执行
  7. (ping -c 1 $i &>/dev/null ;[ $? == 0 ] && echo "$i : successful" >> ./ping.log || echo "$i : failure" >> ./ping.log) &
  8. done
  9. [root@k8s-master 826]#./ping.sh baidu.com 172.16.1.151 1.1.1.1 172.16.1.153
  10. [root@k8s-master 826]# cat ping.log
  11. 172.16.1.151 : successful
  12. baidu.com : successful
  13. 1.1.1.1 : successful
  14. 172.16.1.153 : failure

普通运算,要求数字可以为整型和浮点型

  1. [root@k8s-master 826]# cat arithmetic.sh
  2. #!/bin/bash
  3. # 判断传了几个参数
  4. [ $# -ne 2 ] && echo "请输入两位数字信息" && exit
  5. # 定义变量,方便调用
  6. a=$1
  7. b=$2
  8. # 运算
  9. echo "a-b=$[$a-$b]"
  10. echo "a+b=$[$a+$b]"
  11. echo "a*b=$[$a*$b]"
  12. echo "a%b=$[$a%$b]"
  13. # 除法运算
  14. # 判断小数点前是否有数字,如果结果小于 1,bc 运算结果小数点前没有数字
  15. if [ -z $(echo "scale=2;$a/$b"| bc | cut -d. -f1 ) ];then
  16. # 如果结果小于 1,补一个 0(字符),bc 运算结果小于 0 时,会省略 0
  17. echo "0$(echo "scale=2;$a/$b"| bc )"
  18. else
  19. # 如果结果大于 1,正常输出即可
  20. echo "$(echo "scale=2;$a/$b"| bc )"
  21. fi

传递两个两位数(整型),做运算,要求除法结果保留两位小数

  1. #!/bin/bash
  2. # 判断传了几个参数
  3. [ $# -ne 2 ] && echo "请输入两位数字信息" && exit
  4. # 判断是否是两位的整型数字
  5. [ ${#1} -ne 2 ] || [[ ! $1 =~ ^[0-9][0-9]$ ]] && echo "只能是两位数且为整型"
  6. [ ${#2} -ne 2 ] || [[ ! $2 =~ ^[0-9][0-9]$ ]] && echo "只能是两位数且为整型"
  7. # 定义变量,方便调用
  8. a=$1
  9. b=$2
  10. # 运算
  11. echo "a-b=$[$a-$b]"
  12. echo "a+b=$[$a+$b]"
  13. echo "a*b=$[$a*$b]"
  14. # 做判断,可以获取 2 个小数位
  15. if [ -z $(echo "scale=2;$a/$b"| bc | cut -d. -f1 ) ];then
  16. echo "0$(echo "scale=2;$a/$b"| bc )"
  17. else
  18. echo "$(echo "scale=2;$a/$b"| bc )"
  19. fi
  20. echo "a%b=$[$a%$b]"

传入两个参数,对比两个数字的大小,要求数字可以为整型和浮点型

  1. [root@k8s-master 826]# cat comparenum.sh
  2. #!/bin/bash
  3. # 判断用户输入了 2 个参数
  4. if [ $# -ne 2 ];then
  5. echo "需要输入两个参数啊"
  6. exit
  7. fi
  8. # 判断用户输入的 2 个参数都是数字
  9. if [[ ! $1 =~ ^[0-9]+$ ]] && [[ ! $1 =~ ^[0-9]+\.[0-9]+$ ]];then
  10. echo "第一个参数得是数字啊"
  11. exit
  12. fi
  13. if [[ ! $2 =~ ^[0-9]+$ ]] && [[ ! $2 =~ ^[0-9]+\.[0-9]+$ ]];then
  14. echo "第二个参数得是数字啊"
  15. exit
  16. fi
  17. # 对比两个参数(数字)大小
  18. if [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]];then
  19. # 对比整型数字大小
  20. [[ $1 -eq $2 ]] && echo "$1 = $2"
  21. [[ $1 -gt $2 ]] && echo "$1 > $2"
  22. [[ $1 -lt $2 ]] && echo "$1 < $2"
  23. else
  24. # 对比浮点型数字大小
  25. [[ $(echo "$1 == $2" | bc) -eq 1 ]] && echo "$1 = $2"
  26. [[ $(echo "$1 > $2" | bc) -eq 1 ]] && echo "$1 > $2"
  27. [[ $(echo "$1 < $2" | bc) -eq 1 ]] && echo "$1 < $2"
  28. fi

模拟用户登录终端

  1. #!/bin/bash
  2. db_username="root"
  3. db_password="123"
  4. counts=0
  5. function tty(){
  6. while :
  7. do
  8. read -p "[root@website $(pwd)]# " cmd
  9. $cmd
  10. done
  11. }
  12. while :
  13. do
  14. read -p "Please Input Your Username : " username
  15. read -p "Please Input Your Password : " password
  16. username=${username:=NULL}
  17. password=${password:=NULL}
  18. # 判断登录是否成功
  19. if [ $username == $db_username -a $password == $db_password ];then
  20. # 成功,退出循环
  21. echo "[ Successful ] Login ! "
  22. break
  23. else
  24. # 失败,提示还可以尝试的次数
  25. [ $counts -ne 2 ] && echo "[ Info ] You have only $[2-counts] times left !"
  26. # 判断用户名错误还是密码错误。给予提示
  27. if [ $username != $db_username ];then
  28. echo "[ Warning ] The Username does't exist ! "
  29. else
  30. [ $password != $db_password ] && echo "[ Warning ] Wrong Password ! "
  31. fi
  32. [ $counts -eq 2 ] && exit
  33. fi
  34. let counts++
  35. done
  36. tty

模仿红绿灯

  1. [root@abc 901]# cat signal.sh
  2. #!/bin/bash
  3. # 清屏
  4. clear
  5. #
  6. count=0
  7. while :
  8. do
  9. if [ $(expr $count % 3) -eq 0 ];then
  10. # 红灯亮时间
  11. red_time=5
  12. while :
  13. do
  14. echo -e "\033[31m 红灯亮 ${red_time} \033[0m"
  15. sleep 1
  16. clear
  17. let red_time--
  18. [ $red_time -eq -1 ] && break
  19. done
  20. elif [ $(expr $count % 3) -eq 1 ];then
  21. # 绿灯亮时间
  22. green_time=3
  23. while :
  24. do
  25. echo -e "\033[32m 绿灯亮 ${green_time} \033[0m"
  26. sleep 1
  27. clear
  28. let green_time--
  29. [ $green_time -eq -1 ] && break
  30. done
  31. else
  32. # 黄灯亮时间
  33. yellow_time=2
  34. while :
  35. do
  36. echo -e "\033[33m 黄灯亮 ${yellow_time} \033[0m"
  37. sleep 1
  38. clear
  39. let yellow_time--
  40. [ $yellow_time -eq -1 ] && break
  41. done
  42. fi
  43. let count++
  44. done

服务器状态监控

先编写一个可发送邮件的 Python 程序:

  1. # python 脚本,放在 /usr/bin/ 目录下
  2. [root@k8s-master01 monitor_mail]# cat /usr/bin/mail
  3. #!/usr/bin/python
  4. # -*- coding: UTF-8 -*-
  5. import sys
  6. import smtplib
  7. import email.mime.multipart
  8. import email.mime.text
  9. server = 'smtp.163.com'
  10. port = '25'
  11. def sendmail(server,port,user,pwd,msg):
  12. smtp = smtplib.SMTP()
  13. smtp.connect(server,port)
  14. smtp.login(user, pwd)
  15. smtp.sendmail(msg['from'], msg['to'], msg.as_string())
  16. smtp.quit()
  17. print('Email has send out !!!~~~')
  18. if __name__ == '__main__':
  19. msg = email.mime.multipart.MIMEMultipart()
  20. msg['Subject'] = 'Monitor Warning Mail !!!'
  21. msg['From'] = 'wqh1XXXXX@163.com'
  22. msg['To'] = 'wqh2XXXXX@126.com'
  23. user = 'wqh1XXXXX'
  24. pwd = 'XXXXXXXXXX'
  25. # 格式处理,专门针对我们的邮件格式
  26. content='%s\n%s' %('\n'.join(sys.argv[1:4]),' '.join(sys.argv[4:]))
  27. txt = email.mime.text.MIMEText(content, _charset='utf-8')
  28. msg.attach(txt)
  29. sendmail(server,port,user,pwd,msg)

监控脚本:

  1. # bash 脚本,可以用定时任务执行
  2. [root@k8s-master01 monitor_mail]# cat monitor.sh
  3. #!/bin/bash
  4. # CPU阈值
  5. cpu_limit=0
  6. # 内存阈值
  7. mem_limit=0
  8. # 监控的磁盘分区
  9. disk_name="/dev/sda3"
  10. # 磁盘容量阈值
  11. disk_block_limit=0
  12. # 磁盘Inode阈值
  13. disk_inode_limit=0
  14. function monitor_cpu() {
  15. cpu_free=$(vmstat 1 5 | awk 'NR>=3{x=x+$15}END{print x/5}' | cut -d. -f1)
  16. cpu_used=$(echo "scale=0;100-${cpu_free}" | bc)
  17. cpu_stat=$cpu_used
  18. if [ $cpu_stat -gt $cpu_limit ];then
  19. msg=" DATETIME: $(date +%F_%T)
  20. HOSTNAME: $(hostname)
  21. IPADDR: $(hostname -I| awk '{print $1}')
  22. WARNING:
  23. CPU usage exceeds the limit,current value is ${cpu_stat}% !!!
  24. "
  25. fi
  26. echo -e $msg
  27. /usr/bin/mail $msg
  28. }
  29. function monitor_mem() {
  30. mem_total=$(free | awk 'NR==2{print $2}')
  31. mem_used=$(free | awk 'NR==2{print $3}')
  32. mem_stat=$(echo "scale=2;${mem_used}/${mem_total}" | bc | cut -d. -f2)
  33. if [ $mem_stat -gt $mem_limit ];then
  34. msg=" DATETIME: $(date +%F_%T)
  35. HOSTNAME: $(hostname)
  36. IPADDR: $(hostname -I| awk '{print $1}')
  37. WARNING:
  38. Memory usage exceeds the limit,current value is ${mem_stat}% !!!
  39. "
  40. fi
  41. echo -e $msg
  42. /usr/bin/mail $msg
  43. }
  44. function monitor_disk_block() {
  45. disk_block_used=$(df | awk 'NR==6{print $5}'|cut -d% -f1)
  46. disk_block_stat=$disk_block_used
  47. if [ $disk_block_stat -gt $disk_block_limit ];then
  48. msg=" DATETIME: $(date +%F_%T)
  49. HOSTNAME: $(hostname)
  50. IPADDR: $(hostname -I| awk '{print $1}')
  51. WARNING:
  52. Disk Block usage exceeds the limit,current value is ${disk_block_stat}% !!!
  53. "
  54. fi
  55. echo -e $msg
  56. /usr/bin/mail $msg
  57. }
  58. function monitor_disk_inode() {
  59. disk_inode_used=$(df -i | awk 'NR==6{print $5}'|cut -d% -f1)
  60. disk_inode_stat=$disk_inode_used
  61. if [ $disk_inode_stat -gt $disk_inode_limit ];then
  62. msg=" DATETIME: $(date +%F_%T)
  63. HOSTNAME: $(hostname)
  64. IPADDR: $(hostname -I| awk '{print $1}')
  65. WARNING:
  66. Disk Inode usage exceeds the limit,current value is ${disk_inode_stat}% !!!
  67. "
  68. fi
  69. echo -e $msg
  70. /usr/bin/mail $msg
  71. }
  72. monitor_cpu &>> /tmp/monitor.log
  73. monitor_mem &>> /tmp/monitor.log
  74. monitor_disk_inode &>> /tmp/monitor.log
  75. monitor_disk_block &>> /tmp/monitor.log

Shell 编程练习的更多相关文章

  1. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  2. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  3. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  4. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  5. Linux_10------Linux之shell编程------变量

    .-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...

  6. 需要交互的shell编程——EOF(转载)

    在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...

  7. ****CodeIgniter使用cli模式运行,把php作为shell编程

    shell简介 在计算机科学中,Shell俗称壳(用来区别于核).而我们常说的shell简单理解就是一个命令行界面,它使得用户能与操作系统的内核进行交互操作. 常见的shell环境有:MS-DOS.B ...

  8. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

  9. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  10. centos 下建用户 shell编程

    useradd 用户名 passwd 用户名 cat /etc/passwd  查看用户信息 删除用户 userdel -r   加一个 -r 表示把用户及用户的主目录都删除 su  切换用户 sud ...

随机推荐

  1. 【Oracle】转:通过案例学调优之--Oracle Time Model(时间模型)

    转自:http://blog.51cto.com/tiany/1596012 通过案例学调优之--Oracle Time Model(时间模型) 数据库时间 优化不仅仅是缩短等待时间.优化旨在缩短最终 ...

  2. ctfhub技能树—信息泄露—备份文件下载—网站源码

    打开靶机 查看网页内容 使用dirsearch进行扫描 命令如下 python3 dirsearch.py -u http://challenge-91f1f5e6a791ab02.sandbox.c ...

  3. mount: /dev/sdxx already mounted or /xxxx busy解决方法

    异常现象: 解决方法: 1.    輸入root的密碼,進入單用戶2.    重新掛載/目錄,使其變為可讀可寫 # mount –o rw,remount / 3.    修改/etc/fstab文件 ...

  4. kubernetes之为每个命名空间的pod设置默认的requests以及limits

    一  为啥需要为命名空间里面添加pod添加默认的requests和limits? 通过前面的学习我们已经知道,如果节点上面的pod没有设置requests和limits,这些容器就会受那些设置了的控制 ...

  5. SAP下载文档为乱码

    通过事物WE60下载的文档为乱码,主要原因是编码格式的不匹配,通常默认的编码格式为ANSI编码,那么我们需要将源码的编码格式转换成UTF-8,这样问题可以解决了.   附:编码格式介绍 不同的国家和地 ...

  6. 入门OJ:扫雪

    扫雪1 题目描述 大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出 ...

  7. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...

  8. 广告召回 Query-Ad Matching

    小结: 1.最为基础的召回链路就是要保证召回层的相关性,但是相关性高的广告并不一定具有很高的商业价值,所以开始尝试将一些商业化业务指标作为召回的依据 百度凤巢新一代广告召回系统--"莫比乌斯 ...

  9. LOJ10100

    原题来自:CEOI 1996 一个电话线公司(简称 TLC)正在建立一个新的电话线缆网络,他们连接了若干个地点,编号分别从 1 到 N,没有两个地点有相同的号码,这些线是双向的并且能使两个地点保持通讯 ...

  10. 一文打尽端口复用 VS Haproxy端口复用

    出品|MS08067实验室(www.ms08067.com) 本文作者:Spark(Ms08067内网安全小组成员) 1.概述   Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tc ...