Shell运维实战3-while、case、for、select

这篇具有很好参考价值的文章主要介绍了Shell运维实战3-while、case、for、select。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

case


基本

请注意 case 使用后的闭合问题,开头 case,结尾 esac

#! /bin/bash

read -p "input your number:" ans

# 双引号内写判据
case "$ans" in
  # 对应值+右小括号
  1)
  echo "1";; # 末尾两个引号可视为break
  2)
  echo "2";;
  # *)可视为default
  *)
  echo "i dont understand what you input"
  exit; # 最后一个程序结尾直接退出
esac # 别忘了case末尾需要闭合!

case 企业级案例

此次案例展示:使用函数传参的方式来为 conf 添加用户

[root@oldboy scripts]# cat add-openvpn-user
#! /bin/bash

. /etc/init.d/functions

#config file path
FILE_PATH=/etc/openvpn_authfile.conf           #<==这是openvpn的登录授权文件路径。
[ ! -f $FILE_PATH ] && touch $FILE_PATH        #<==如果变量对应的文件不存在,则创建文件。
usage(){                                       #<==帮助函数。
    cat <<EOF                                #<==这是一个可以替代echo的输出菜单等内
                                                        容的方法。
    USAGE: `basename $0` {-add|-del|-search} username
EOF
}

#judge run user
if [ $UID -ne 0 ] ; then    #<==必须是root用户,才能执行本脚本。
    echo "Youare not supper user, please call root! "
    exit 1;
fi

#judge arg numbers.
if [ $# -ne 2 ] ; then      #<==传入的参数必须为两个。
    usage
    exit 2
fi
#满足条件后进入case语句判断。
case "$1" in                #<==获取命令行第一个参数的值。
    -a|-add)                #<==如果匹配-a或-add,则执行下面的命令语句。
        shift               #<==将$1清除,将$2替换为$1,位置参数左移。
        if grep "^$1$" ${FILE_PATH} >/dev/null 2>&1     #<==过滤命令行第一个参
                                                                数的值,如果有
            then              #<==则执行下面的指令。
            action $"vpnuser, $1 is exist" /bin/false
            exit
            else              #<==如果文件中不存在命令行传参的一个值,则执行下面的指令。
            chattr -i ${FILE_PATH}             #<==解锁文件。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
#<==备份文件(尾部加时间)。
            echo "$1" >> ${FILE_PATH}        #<==将第一个参数(即用户名)加入到文件。
            [ $? -eq 0 ] && action $"Add $1" /bin/true      #<==如果返回值为0,提
                                                                示成功。
            chattr +i ${FILE_PATH}             #<==给文件加锁。
        fi
        ;;
    -d|-del)       #<==如果命令行的第一个参数匹配-d或-del,则执行下面的命令语句。
        shift
        if [ `grep "\b$1\b" ${FILE_PATH}|wc -l` -lt 1 ]   #<==过滤第一个参数值,
                                                                并看文件中是否存在。

            then     #<==如果不存在,则执行下面的指令。
            action $"vpnuser, $1 is not exist." /bin/false
            exit
        else       #<==否则执行下面的指令,存在才删除,不存在就提示不存在,不需要删除。
            chattr -i ${FILE_PATH}                #<==给文件解锁,准备处理文件的内容。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
#<==备份文件(尾部加时间)。
            sed -i "/^${1}$/d" ${FILE_PATH}       #<==删除文件中包含命令行传参的用户。
            [ $? -eq 0 ] && action $"Del $1" /bin/true
#<==如果返回值为0,提示成功。
            chattr +i ${FILE_PATH}                #<==给文件加锁。
            exit
        fi
        ;;
    -s|-search)    #<==如果命令行的第一个参数匹配-s或-search,就执行下面的命令语句。
        shift
        if [ `grep -w "$1" ${FILE_PATH}|wc -l` -lt 1 ]
#<==过滤第一个参数值,并看文件中是否存在。
            then
            echo $"vpnuser, $1 is not exist."; exit
        else
            echo $"vpnuser, $1 is exist."; exit
        fi
        ;;
    *)
        usage
        exit
        ;;
esac

while 循环


当型与直到

当型即 while,当条件成立时才继续执行

while <条件表达式>
do
    指令...
done

直到即 until,当条件成立后就停止循环

until <条件表达式>
do
    指令...
done

每隔两秒输出一次负载值的程序

#! /bin/bash

while [ 1 ]
do
  uptime
  sleep 2
done

后台运行

Shell运维实战3-while、case、for、select

比如这样子可以让程序后台执行 sh demo1.sh &


while 实战

每个十秒检测一个网站是否正常

#! /bin/sh
if [ $# -ne 1 ]; then               #<==判断,若传参的个数不为1,
    echo $"usage $0 url"            #<==则打印正确使用提示。
    exit 1                          #<==以返回值1退出脚本。
fi

while true                          #<==永远为真,进入while循环。
do
    if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}"   $1|
egrep -w "200|301|302"|wc -l` -ne 1 ]
    #<==对传入的URL参数获取状态码,过滤200、301、302任意之一转为数字,如果不等于1,
则表示状态信息不对。
        then
        echo "$1 is error."         #<==提示URL访问错误。
        #echo "$1 is error."|mail -s "$1 is error." 31333741--@qq.com
                                    #<==发送邮件报警。
    else
        echo "$1 is ok"             #<==否则,提示URL访问OK。
    fi
    sleep 10   #<==休息10秒继续执行while循环,注意,当while后面有true等永远为真的条件时,一般在循环里要有退出循环的条件或类似sleep休息的命令,否则会大量消耗系统资源。
done

日常开发时,推荐吧常用的函数放置到函数库 function 里面,类似于前端封装的工具类,便于后期调用


每一个小时检测某个 IP 是否访问量超过了 500 次,如果是,则判定其为恶意的,直接自动封禁

file=$1          #<==定义一个变量接收命令行传参,参数为日志文件类型。

while true
do
    awk '{print $1}' $1|grep -v "^$"|sort|uniq -c >/tmp/tmp.log
    #<==分析传入的日志文件,并在排序去重后追加到一个临时文件里。
    exec </tmp/tmp.log     #<==读取上述临时文件。
    while read line         #<==进入while循环处理。
    do
        ip=`echo $line|awk '{print $2}'`          #<==获取文件中的每一行的第二列。
        count=`echo $line|awk '{print $1}'`       #<==获取文件中的每一行的第一列。
        if [ $count -gt 500 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]
        #<==如果PV数大于500,并且防火墙里没有封过此IP。
            then
            iptables -I INPUT -s $ip -j DROP      #<==则封掉PV数大于500的IP。
            echo "$line is dropped" >>/tmp/droplist_$(date +%F).log
                                                    #<==记录处理日志。
        fi
    done
    sleep 3600  #<==读者可以按分钟进行分析,不过日志的分割或过滤也得按分钟才行。
done

for & select


for 循环方法

由两种典型的定义 for 循环的方法

# shell中foreach风格的for
# 下面展示的被迭代的数据为一个数组,数字之间使用空格隔开
for num in 1 2 3 4 5
do
  echo $num
done

# C风格的for
for ((i=1; i<=3; i++))
do
  echo $i
done

配合其他语法可以实现特殊的效果

# 花括号列表形式
for n in {5..1}        #<==实质上也相当于列表。
do
    echo $n
done

# seq步长,反引号实际上规定了一个执行linux命令的区域
for n in `seq 5 -1 1` #<==5是起始数字,-1是步长,即每次减一,1是结束数字。
do
    echo $n
done

linux 生成随机数
# $RANDOM 系统变量,生成随机数
# 后面的参数表示使用md5进行加密
echo "oldboy$RANDOM"|md5sum|cut -c 8-15

# 借助openssl生成安全稳定的随机数
openssl rand -base64 8

# 通过date获取随机数
date +%s%N

# 借助UUID生成随机数
cat /proc/sys/kernel/random/uuid

# 使用expect的子库mkpassowrd快速生成随机数
# -l长度 -d数字个数 -c小写字母个数 -C大写字母个数 -s特殊字符个数
mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1

select

select 的作用和 foreach 对应功能差不多一样,可以借鉴

他可以根据给定数组或者列表,输出对应列表项(即 select 过后,echo 输出的结果将以列表的形式呈现)文章来源地址https://www.toymoban.com/news/detail-458204.html

arr=(hey shit pig)
select s in "${arr[@]}"
do
  echo $s
done

到了这里,关于Shell运维实战3-while、case、for、select的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法笔记】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)、位运算、递归、公式、sizeof。 习题链接:题目链接 该题把我们的所有能用的方法都给限制死了,我们只能用一些的特殊的方法来做。不知道大家在思考的过程中考没考虑过

    2024年02月07日
    浏览(63)
  • 【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)

    ​本篇文章几乎涵盖了绝大部分的Shell语法练习,用一个个实战练习,巩固Shell的学习,话不多说,直接开始。 练习1:按照时间生成文件\\\"2018-05-22.log\\\"将每天的磁盘使用状态写入到对应日期的文件 练习2:统计Nginx日志中每个IP的访问量有多少,日志格式如下 练习3:写一个脚本

    2024年02月14日
    浏览(62)
  • SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

    SELECT INTO 语句将数据从一个表复制到一个新表中。 新表将按照在旧表中定义的列名和类型创建。您可以使用 AS 子句创建新的列名。 以下 SQL 语句创建 Customers 的备份副本: 以下 SQL 语句使用 IN 子句将表复制到另一个数据库中的新表中: 以下 SQL 语句仅复制一些列到新表中:

    2024年02月05日
    浏览(119)
  • Spring XML使用CASE WHEN处理SELECT字段

    在日常开发中,经常会碰到需要导出的情况。而一些枚举值或者状态一般是定义成整型,这个时候需要对数据进行转换,转换成对应的文本再导出。 在XML中用CASE WHEN来根据不同的查询结果做不同的处理。 比如 这样,如果学生的状态值是1,则返回在学;如果状态值是2,则返

    2024年02月05日
    浏览(45)
  • Linux shell编程学习笔记20:case ... esac、continue 和break语句

    在实际编程中,我们有时会请到多条件多分支选择的情况,用if…else语句来嵌套处理不烦琐,于是JavaScript等语言提供了多选择语句switch ... case。与此类似,Linux Shell脚本编程中提供了case...in...esac 语句,来实现多条件多分支选择结构:其语法结构为:   case 变量名 in 值1[|值

    2024年02月05日
    浏览(50)
  • Shell脚本while循环语句应用

    记录 :433 场景 :Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本 :CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一:while do done 1.2格式二:无限循环(while : do done) 1.3格式三:无限循环(while true do done) 2.使用while遍历数组

    2024年02月06日
    浏览(75)
  • 【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

    上篇文章 介绍了 if 语句相关知识。但 if 语句只能执行命令,判断该命令的结果,但在编程中,我们多数情况需要判断一个变量的值是否为空?判断两个变量的值谁更大?判断变量的字符串是否相等?这些判断条件,使用 if 语句无法直接判断。这篇文章介绍 if 语句中只能执

    2024年02月16日
    浏览(45)
  • Linux shell编程学习笔记18:while循环语句

    上回我们研究和探讨了Linux shell编程中for 循环语句,与在C/C++中一样,for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。 我们继续以for循环语句中的例子,计算 从1到10与2的乘积 并输出。 1.在zsh命令行中 # csdn @ edu in ~ [20:35:57]  $ i=1; while

    2024年02月06日
    浏览(56)
  • 循环(while do...while for)介绍

    1.while循环 while循环是先判断后执行 while循环一般都会有: 循环初始值, 循环条件 和 循环变量增量(或者减量) 2.do…while do…while先执行一次,再进行判断 do–while 和 while的区别 注意: 1, do-while和while比较类似, 也有表达式和执行代码 2, do-while和while的区别在于判断条件的先后不一样

    2024年02月09日
    浏览(40)
  • 深入理解 Java 循环结构:while、do while、for 和 for-each 循环

    循环可以执行一个代码块,只要达到指定的条件。循环很方便,因为它们节省时间,减少错误,并使代码更易读。 while 循环会循环执行一个代码块,只要指定的条件为真: 语法 在下面的示例中,只要变量(i)小于 5,循环中的代码将一遍又一遍地运行: 示例 注意:不要忘

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包