您的位置:首页 > 运维架构 > Shell

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

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

写多分支if时需要注意的:
1、涉及到使用$调用变量一定要用双引括起来
2、判断使用的[]俩边要留有空格
3、等号2边可不可以有空格我也忘了,在测吧
4、定义变量时,直接赋给字符串。调用时才加$
5、运算时是$(()) 2个小括号;调用系统命令时要用$()括起来
6、Echo 时,如果有变量或函数 不要带中文;输出函数时要用()一个小括号括起来
7、只有else里才不用写then (if和elif里都要写)
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐