条件判断if和循环语句

过程式编程语言:顺序执行,选择执行,循环执行

1.if语句:条件选择

(1) 执行机制:逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
- && 代表and
- || 代表or
(2)单分支

if 判断条件;then
条件为真的分支代码
fi

(3)双分支

if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi

(4)多分支

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

(5)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

2.case语句:条件判断

case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
eg:打印棋盘
#!/bin/bash
for i in $(seq 16);do
     let m=$i%4
     case $m in
     1|2)
         for j in $(seq 4);do
              echo -ne "\033[42m    \033[0m"
              echo -ne "\033[46m    \033[0m"
          done
          ;;
     3|0)
         for j in $(seq 4);do
               echo -ne "\033[46m    \033[0m"
               echo -ne "\033[42m    \033[0m"
         done
         ;;
      esac
      echo
done

运行结果:

Paste_Image.png

3.for循环

(1) 执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执
行一次循环体; 直到列表中的元素耗尽,循环结束

for 变量名 in 列表;do
循环体
done

(2)列表生成方式:

(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用;
$@, $*

(3)for循环的特殊格式:

  • 双小括号方法,即((…))格式,也可以用于算术运算
  • 双小括号方法也可以使bash Shell实现C语言风格的变量操作I=10((I++))
for ((控制变量初始化;条件判断表达式;控制变量的修正表达
式))
do
循环体
done

 控制变量初始化:仅在运行到循环代码段时执行一次
 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

eg:打印99乘法表

#!/bin/bash
 for i in {1..9};do
          for j in `seq $i`;do
               let n=i*j
             echo -en "$j*$i=$n\t"
           done
    echo
  done

运行结果:


Paste_Image.png
eg:打印等腰三角形
#!/bin/bash
if [ $# -eq 0 ];then # $#代表所有参数个数
       read -p "please input lines:" lines; #提示输入参数
else  
       lines=$1 #把第一个参数赋值给lines
fi

if [[ $lines =~ ^[0-9]+$ ]] ;then #判断是不是输入的数字
       [ $lines -eq 0 ] && { echo lines can not is zero;exit 1; }
else 
             echo lines must is digit
             exit 2
fi

for i in `seq $lines`;do 
       for space in `seq $[lines-i]`;do
               echo -n " "   
       done 

       for star in `seq $[2*i-1]`;do
              declare -i N=$(($RANDOM%7+30))
                if [[ $N -gt 31 && $N -lt 37 ]];then
                        echo -e "\033[1;${N};5m*\c\0mm"
                 else 
                        echo -e "\033[31;5m*\c\0mm"
                 
                  fi
       done
   echo
done

运行结果:

Paste_Image.png

4.while循环

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

while循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
eg:打印棋盘
#!/bin/bash
i=0
while [ $i -lt 8 ];do
        j=0
        while [ $j -lt 8 ];do
                let  flags=(i+j)%2
                if [ $flags -eq 0 ];then
                         echo -en "\033[42m  \033[0m"
                else 
                         echo -en "\033[46m  \033[0m"
                fi
                let j++
         done
         echo
          let i++
done

运行结果:

Paste_Image.png
#!/bin/bash
i=0
while [ $i -lt 8 ];do
      let a=$i%2
          if [ $a -eq 0 ];then
                     j=0
                     while [ $j -lt 8 ];do
                            echo -en "\033[46m    \033[0m"
                            echo -en "\033[42m    \033[0m"
                            [ $j -eq 3 ] && echo
                            [ $j -eq 7 ] && echo
                          let j++
                        done     
          else
                  j=0
                    while [ $j -lt 8 ];do
                             echo -en "\033[42m    \033[0m"
                             echo -en "\033[46m    \033[0m" 
                             [ $j -eq  3 ] && echo 
                             [ $j -eq  7 ] && echo  
                            let j++
                     done
           fi
          
          let i++
done

运行结果:

Paste_Image.png

5.until循环

until CONDITION; do
循环体
done

进入条件: CONDITION 为false
出条件: CONDITION 为true

6.循环控制语句continue

  • 用于循环体中
  • continue [N]:提前结束第N层的本轮循环,而直接进入下一
    轮判断;最内层为第1层
    eg:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done

7.循环控制语句break

 用于循环体中
 break [N]:提前结束第N层循环,最内层为第1层
eg:

while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done

8.循环控制shift命令

  • shift [n]
 用于将参量列表 list 左移指定次数,缺省为左移一次。
 参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift

eg:

 ./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
eg:创建用户
#!/bin/bash
while [ $# -gt 0 ] #or (( $# > 0 ))
do 
    id $1 &>/dev/null && continue
    useradd $1 && echo $1 is create
    shift
done

9.创建无限循环

 while true; do
循环体
done
until false; do
循环体
    Done
Paste_Image.png

10.select循环与菜单

select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
 用户输入菜单列表中的某个数字,执行相应的命令
 用户输入被保存在内置变量 REPLY 中

select与case

(1)select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c退出循环
(2)select 经常和 case 联合使用
(3)与 for 循环类似,可以省略 in list,此时使用位置参量
#!/bin/bash
PS3="Please choose your menu:"
select menu in lamian humian yangroutang;do
          case $REPLY in
             1)
                    echo "The price is \$5"
                     ;;
             2)
                    echo "The price is \$6"
                     ;;
             3)
                    echo "The price is \$8"
                     ;;
             *) 
                    echo "we haven't"
                    break
                      ;;
             esac
done

运行结果:

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1 概述 编写shell脚本,一般离不开条件选择,条件判断以及循环语句。掌握这三个语法,将大大提高脚本的编写效率,...
    ghbsunny阅读 1,509评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 性格,耐心和求知欲的重要性。 你必须有浓厚的兴趣去弄明白正在发生的事情背后的原因。并且能够长期保持这种心态。
    幸福的眼泪_52da阅读 86评论 0 0
  • 卸妆油消除脂肪粒方法 部分眼霜和卸妆油是可以消除脂肪粒的,去除眼部脂肪粒,要使用着哩状的眼霜,卸妆油主要使用脸部鼻...
    LHo阅读 210评论 0 0
  • 一场大雨赶走了布谷鸟的叫唤,闷沉沉的天气分不清季节。 潮湿得令人抑郁。 去年这个时候,早已是艳阳高照,街头潮人纷纷...
    会飞的呆瓜阅读 217评论 0 1