条件语句详解if,for,while,case,until,shift

if语句

单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi

if示例

根据命令的退出状态来执行命令

if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance‘
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi

case语句

case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b

选菜菜单

case $number in
1|2|3)
cmd1
;;
4|5|6)
cmd1
;;
...
*)
cmd6
esac
case脚本
cat  <<EOF
1:lamian
2:gaifan
3:jiaozi
4:baozi
EOF
# 选菜菜单  vim xuancai.sh
PS3="Please input a number:"
select MENU in lamian huimian gaifan jiaozi baozi quit;do
        case $REPLY in
        1|2)
                echo "The price is 15元"
                ;;
        3|5)
                echo "The price is 20元"
                ;;
        4)
                echo "The price is 25元"
        ;;
        6)
                echo "bye"
                break
                ;;
        *)
                echo "Input false"
        esac
done

执行命令
bash xuancai.sh

read -p "Please choose menu num: " menu
case $menu in
1|2)
    echo "lamian gaifan 15元 "
;;
3|4)
    echo "jiaozi baozi 10元"
;;
*)
echo "wrong"

例如:

read -p "Do you agree(yes or no)? " ans
ans= 'echo "$ans|tr 'a-z' 'A-Z'" '
case $ans in
y|yes)
echo yes
;;
n|no)
echo no
*)
echo wrong
;;
esac  

循环

for适用于有列表的循环
while适合没有列表的循环,比较通用
until与while条件相反

for循环

for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直
到列表中的元素耗尽,循环结束
for特殊格式
双小括号方法,即((…))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作
I=10
((I++))
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做
条件判断

for     ;do
      for    ;do
         if        ;then
             continue,break(默认1,2为退出,执行外层循环)
         fi
      done
done
lastb  查询其他人登陆失败的信息
&> /dev/null  #将输出结果扔到垃圾箱,不在屏幕显示
防止dos攻击,将攻击的ip地址放到/data/cracker_ip.log中
netstat -nat|sed -nr '/^tcp /s/.*  ([1-9].*):.*/\1/p'|sort  |uniq -c |while read iplist ;do
        linknum=`echo $iplist|cut -d" " -f1`
        ip=`echo $iplist|cut -d" " -f2`
        if [ $linknum -ge 2 ];then
                echo $ip >> /data/cracker_ip.log
        fi
done
#!/bin/bash
# 象棋方块
for i in {1..8};do
        temp1=$[ $i % 2 ]

        for j in {1..8};do
        temp2=$[ $j % 2 ]

        if [ $temp1 -eq  $temp2  ];then
                echo -e -n "\033[47m  \033[0m"
        else
                echo -e -n "\033[41m  \033[0m"
        fi

        done

        echo 
done

实验:输入一个行号,打印一个等腰三角形

如图:
在这里插入图片描述

#!/bin/bash
#********************************************************************
read -p "Please input line: " line
for i in `seq $line`;do
        let star=$i*2-1
        let space=$line-$i
        for j in `seq $space`;do
                echo -n " "
        done
        for k in `seq $star`;do
                echo -n "*"
        done
        echo
done

批量ping一个网络ID中的254个IP地址,并把能够Ping通的地址放到:/tmp/iplist.log

例如ping百度的IP:123.125.115.110
bash scanip00.sh 输入正确格式的IP地址
ping
cat /tmp/iplist.log
结果
能够Ping通的IP
代码

#********************************************************************
#scanip00.sh    # 脚本名
> /tmp/iplist.log   #每次运行前清空该文件内容
read -p "Please input a netid:(eg:192.168.34.0) " netid  #输入IP
netid=`echo $netid | sed -nr 's#(.*)\..*#\1#p'`
echo netid=$netid
for id in {1..254};do
        {
        if ping -c1 -w1  $netid.$id &>/dev/null ;then
                echo "$netid.$id" >> /tmp/iplist.log  #ping通的放入文件
                echo $netid.$id is up
        else 
                echo $netid.$id is down
        fi
        }&                  #并行执行
done
wait

计算从1加到100
echo {1…100}|tr ’ ’ +|bc 管道计算得出5050
或者写一个脚本
sum.sh
sum=0
for i in {1…100};do
let sum=sum+i
done
echo sum=$sum
bash sum.sh 得出5050

while循环

while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后
会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”
终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被
修正
进入条件:CONDITION为true
退出条件:CONDITION为false

until循环

until CONDITION; do
循环体
done
进入条件: CONDITION 为false
退出条件: CONDITION 为true
循环控制语句continue
用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
while CONDTIITON1; do
CMD1

if CONDITION2; then
continue
fi
CMDn

done

循环控制语句break

用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
while CONDTIITON1; do
CMD1

if CONDITION2; then
break
fi
CMDn

done

循环控制shift命令

shift [n]
用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h

示例:doit.sh

#!/bin/bash
#Name: doit.sh
#Purpose: shift through command line arguments
#Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done

在这里插入图片描述

示例:shift.sh

#!/bin/bash
#step through all the positional parameters
until [ -z “$1” ]
do
echo “$1”
shift
done
echo
在这里插入图片描述

创建无限循环

while true; do
循环体
done
until false; do
循环体
Done

select循环与菜单

select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中
select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环
select 经常和 case 联合使用
与 for 循环类似,可以省略 in list,此时使用位置参量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值