加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell编程学习笔记6--条件判断(循环)与流程控制

发布时间:2020-12-15 19:47:33 所属栏目:安全 来源:网络整理
导读:shell主要用来办公自动化,简化运维管理员的操作的。只要实现功能就可以,不需要考虑代码的简介和运行效率(因为这种脚本只有管理员一个人用) 写多分支if时需要注意的 : 1、 涉及到使用 $ 调用变量 一定要用 双引 括起来 2、 判断使用的 [] 俩边要留有空格

shell主要用来办公自动化,简化运维管理员的操作的。只要实现功能就可以,不需要考虑代码的简介和运行效率(因为这种脚本只有管理员一个人用)


写多分支if时需要注意的:

1、涉及到使用$调用变量一定要用双引括起来

2、判断使用的[]俩边要留有空格

3、等号2边可不可以有空格我也忘了,在测吧

4、定义变量时,直接赋给字符串。调用时才加$

5、运算时是$(()) 2个小括号;调用系统命令时要用$()括起来

6、Echo 时,如果有变量或函数 不要带中文;输出函数时要用()一个小括号括起来

7、只有else里才不用写then ifelif里都要写)

8、错误才加exit终止程序,并返回错误码


我的理解是:下表的参数,就相当于是php的内置函数,标蓝的是常用的

1、按照文件类型进行判断


注意:语法俩边要加空格,该指令可以在shell下直接使用,也可以写在shell脚本中


使用&&和||,就不用每次echo $?看结果了


2、按照文件权限进行判断


3、俩个文件之间进行比较



4、俩个整数间比较


因为加了-ge等这些操作符,所以bash会给他自动转为数值,而不是拿他当字符串

5、字符串的判断


注意:前俩是操作变量的,后面这俩也可以给变量使用。在shell脚本中调这变量一定要加双引号


6、多重条件(逻辑)判断(表达式用的)



分支if

学习编程思维的思路:

写条件表达式的思路:先给要判断的条件在shell中以命令的形式执行一遍,看看效果对不对,对咯在写
#!/bin/bash

#判断登录的是否为root用户
#思路:环境变量里找USER行,拿等号分割,截取第2列
test=$(env | grep "USER" | cut -d "=" -f 2)

if [ "$test" == 'root' ]
        then
                echo '是root用户';
fi
#!/bin/bash
#判断分区使用率
#思路:分区 | 取 /dev/vda1 | 取第5列 | 去掉%
rate=$(df -h | grep "/dev/vda1" | awk '{print $5}' |  cut -d "%" -f 1)


if [ $rate -gt 10 ]
        then
                echo '警告!/dev/vda1 使用率高于10%'
fi

分支if


#!/bin/bash
#如果根目录下的root目录存在
if [ -d /root ]
        then
                echo '存在'
else
                echo '不存在'
fi
#!/bin/bash

#判断nginx是否启动
#思路:截取nginx的进程,-v取反,不取反的话,即使service nginx stop停止之后,还是会有个grep nginx

test=$(ps aux | grep nginx | grep -v grep)

if [ -n "$test" ]
        #不为空
        then
                echo "$(date) nginx ok" >> /tmp/autostart-info.log
        else
                service nginx start $> /dev/null #正确和错误的输出,都丢到/dev/null里不管
                echo "$(date) restart ok" >> /tmp/autostart-err.log
fi

分支if


计算器思路:

1、效验用户有无输入内容

2、判断用户输入的是否为数字

3、判断输入的运算符,是否合法

4、进行运算,返回结果

#接收用户输入的参数,给变量
read -t 30 -p '请输入数字1:' num1
read -t 30 -p '请输入数字2:' num2
read -t 30 -p '请输入运算符:' ope

#判断3个变量是否为空
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
        then #不为空
                #判断用户输入的是否为数字。将$num1的值给sed替换,能替换成空证明是数字
                test1=$(echo "$num1" | sed 's/[0-9]//g')
                test2=$(echo "$num2" | sed 's/[0-9]//g')
        #如果接收到的变量是空的,证明上一步替换成功,用户输入的是数字
        if [ -z "$test1" -a -z "$test2" ]
                then #用户输入的是数字
                if [ "$ope" == '+' ]
                        then
                        sum=$(($num1 + $num2))
                elif [ "$ope" == '-' ]
                        then
                        sum=$(($num1 - $num2))
                elif [ "$ope" == '*' ]
                        then
                        sum=$(($num1 * $num2))
                elif [ "$ope" == '/' ]
                        then
                        sum=$(($num1 / $num2))
                else
                        echo '输出的运算符我不认识';
                        exit 400 #退出程序,返回错误代码400
                fi
        else
                echo '输入的不是数字'
                exit 401
        fi
else
        echo '有变量未传值'
        exit 402
fi

echo "$num1 $ope $num2 = $sum " #输出结果
#!/bin/bash

#判断用户输入的是什么文件

#思路:接收键盘的输入,并赋给变量file(白色字儿)
read -p "请输入文件名:" file

if [ -z "$file" ] #判断变量是否为空
        then #为空才进来
                echo "您没有输入文件名"
                exit 400
elif [ ! -e "$file" ] #该文件不存在
        then
        echo "该文件不存在"
        exit 401
elif [ -f "$file" ] #是普通文件
        then
        echo "$file is a regulare file"
elif [ -d "$file" ] #判断是否为目录
        then
        echo "$file is a 目录"
else
        echo "你进入了else"

fi


多分支case语句(相当于php的switch)



注意:这个带双分号;默认的*不要带引号

#!/bin/bash
#判断用户输入的是什么
read -p "请输入yes或no:" -t 30 cho #接收用户输入的值


case "$cho" in  #相当于php中的switch
        "yes")  #相当于php中switch里的case 
                echo "同意安装该软件"
                ;;
        "no")
                echo "终止安装该软件"
                ;;
        *)      #相当于php中switch里的default
                echo "请输入正确的"
                ;;
esac

for循环


#!/bin/bash

#循环5次,每次把值赋给i变量
for i in 1 2 3 4 5
        do
                echo $i
        done
#!/bin/bash

#批量解压缩
cd /root/dll/ #切换进待解压缩的目录

#原理:将待解压的压缩包名,写到一个日志里,读取这个日志,进行解压缩
ls *.tar.gz > tar.log #第一个是覆盖,防止log日志里有东西
ls *.tgz >> tar.log #追加,他会自己换行


for i in $( cat tar.log ) #读取待解压的压缩包名
        do
                tar xzvf $i  #解压
        done

rm -rf /root/dll/tar.log

注意:这个传统for循环是俩个(())

#!/bin/bash

#传统for循环 从1加到100
s=0
for((i=1;i<=100;i=i+1))
        do
                s=$(($s+$i))
        done
echo "从1加到100的结果是:"$s

while循环和until循环


注意:while容易造成死循环,推荐使用for
#!/bin/bash


#从1加到100
i=1
s=0
while [ $i -le 100 ] #$i小于100
        do
                s=$(( $s+$i ))
                i=$(( $i+1 ))
        done
echo '从1+到100的结果是='$s


#!/bin/bash


#从1加到100
i=1
s=0
#和while相比,直接改-gt这符号,就达到了取反的效果
until [ $i -gt 100 ] #$i大于100,条件不成立,则循环。
        do
                s=$(( $s+$i ))
                i=$(( $i+1 ))
        done
echo '从1+到100的结果是='$s

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读