• shell脚本的流程控制


    一、if 判断

    1)基本语法

    (1)单分支

    1. if [ 条件判断式 ];then
    2. 程序
    3. fi

    或者

    1. if [ 条件判断式 ]
    2. then
    3. 程序
    4. fi

     大于18,命令行输出OK

    1. [root@hadoop ~]# a=25
    2. [root@hadoop ~]# if [ $a -gt 18 ];then echo OK; fi
    3. OK
    4. [root@hadoop ~]# a=15
    5. [root@hadoop ~]# if [ $a -gt 18 ]; then echo OK; fi

    或者

    1. [root@hadoop scripts]# a=25
    2. [root@hadoop scripts]# if [ $a -gt 18 ] && [ $a -lt 35 ];then echo OK;fi
    3. OK

     判断是否张三,是输出张三

    1. [root@hadoop scripts]# vim if_test.sh
    2. #!/bin/bash
    3. if [ "$1"x = "zhangsan"x ] #等号左右加x,避免输入空值报错
    4. then
    5. echo "zhangsan"
    6. fi
    7. [root@hadoop scripts]# . if_test.sh zhangsan
    8. zhangsan
    9. [root@hadoop scripts]# . if_test.sh
    10. [root@hadoop scripts]# . if_test.sh lisi

     逻辑与-a,逻辑或-o

    1. [root@hadoop scripts]# a=36
    2. [root@hadoop scripts]# if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi
    3. [root@hadoop scripts]# if [ $a -gt 18 && $a -lt 35 ]; then echo OK; fi
    4. -bash: [: missing `]' #不能直接用
    5. [root@hadoop scripts]# if [ $a -gt 18 -a $a -lt 35 ]; then echo OK; fi
    6. [root@hadoop scripts]# a=20
    7. [root@hadoop scripts]# if [ $a -gt 18 -a $a -lt 35 ]; then echo OK; fi
    8. OK

     (2)多分支

    1. if [ 条件判断式 ]
    2. then
    3. 程序
    4. elif [ 条件判断式 ]
    5. then
    6. 程序
    7. else
    8. 程序
    9. fi

     判断属于哪个年龄段,双分支

    1. [root@hadoop scripts]# vim if_test.sh
    2. #!/bin/bash
    3. if [ "$1"x = "zhangsan"x ]
    4. then
    5. echo "zhangsan"
    6. fi
    7. #输入第二个参数,表示年龄,判断属于哪个年龄段
    8. if [ $2 -lt 18 ]
    9. then
    10. echo "未成年人"
    11. else
    12. echo "成年人"
    13. fi
    14. [root@hadoop scripts]# . if_test.sh zhangsan 15
    15. zhangsan
    16. 未成年人
    17. [root@hadoop scripts]# . if_test.sh zhangsan 25
    18. zhangsan
    19. 成年人

      判断属于哪个年龄段,多分支

     

    注意事项:

    ①[ 条件判断式 ],中括号和条件判断式之间必须有空格

    ②if 后要有空格 

    二、case 语句

    1)基本语法

    case $变量名 in

    "值 1")

    如果变量的值等于值 1,则执行程序 1

    ;;

    "值 2")

    如果变量的值等于值 2,则执行程序 2

    ;;

    …省略其他分支…

    *) 如果变量的值都不是以上的值,则执行此程序

    ;;

    esac

    输入数字,输出对应语句

    1. [root@hadoop ~]# vim case_test.sh
    2. #!/bin/bash
    3. case $1 in
    4. 1)
    5. echo "one"
    6. ;;
    7. 2)
    8. echo "two"
    9. ;;
    10. 3)
    11. echo "three"
    12. ;;
    13. *)
    14. echo "number else"
    15. ;;
    16. esac
    17. [root@hadoop ~]# chmod +x case_test.sh
    18. [root@hadoop ~]# . case_test.sh
    19. number else
    20. [root@hadoop ~]# . case_test.sh 2
    21. two
    22. [root@hadoop ~]# . case_test.sh 1
    23. one
    24. [root@hadoop ~]# . case_test.sh 6
    25. number else

    注意事项:

    (1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

    (2)双分号“;;”表示命令序列结束,相当于 java 中的 break。

    (3)最后的“*)”表示默认模式,相当于 java 中的 default。 

    三、for 循环

    1)基本语法1

    for (( 初始值;循环控制条件;变量变化 ))

    do

            程序

    done

     2)案例实操

    从 1 加到 100,注意在for循环里面可以直接用数学运算符

    1. [root@hadoop ~]# vim sum_to.sh
    2. [root@hadoop ~]# cat sum_to.sh
    3. #!/bin/bash
    4. sum=0
    5. for (( i=1; i <= $1; i++ ))
    6. do
    7. sum=$[ $sum + $i ]
    8. done
    9. echo $sum
    10. [root@hadoop ~]# chmod +x sum_to.sh
    11. [root@hadoop ~]# . sum_to.sh 100
    12. 5050

     3)基本语法 2

    for 变量 in 值 1 值 2 值 3…

    do

            程序

    done

    1. [root@hadoop ~]# for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum
    2. 5050

    (2)比较$*和$@区别

    $*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n 的形式输出所有参数。 

    没加双引号,两种输出结果没有区别

    1. [root@hadoop scripts]# vim parameter_for_test.sh
    2. #!/bin/bash
    3. echo '============$*================'
    4. for para in $*
    5. do
    6. echo $para
    7. done
    8. echo '============$@================'
    9. for para in $@
    10. do
    11. echo $para
    12. done
    13. [root@hadoop scripts]# chmod +x parameter_for_test.sh
    14. [root@hadoop scripts]# . parameter_for_test.sh a b c d e
    15. ============$*================
    16. a
    17. b
    18. c
    19. d
    20. e
    21. ============$@================
    22. a
    23. b
    24. c
    25. d
    26. e

    加双引号,两种输出结区别,一种有换行,一种没有换行。

    当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输 出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数。

    1. [root@hadoop scripts]# vim parameter_for_test.sh
    2. #!/bin/bash
    3. echo '============$*================'
    4. for para in "$*"
    5. do
    6. echo $para
    7. done
    8. echo '============$@================'
    9. for para in "$@"
    10. do
    11. echo $para
    12. done
    13. [root@hadoop scripts]# . parameter_for_test.sh a b c d e
    14. ============$*================
    15. a b c d e
    16. ============$@================
    17. a
    18. b
    19. c
    20. d
    21. e

    四、while循环

    1)基本语法

    while [ 条件判断式 ]

    do

            程序

    done

    2)案例实操

    从1加到100

    1. [root@hadoop scripts]# vim sum_to.sh
    2. #!/bin/bash
    3. #用for进行实现
    4. sum=0
    5. for (( i=1; i <= $1; i++ ))
    6. do
    7. sum=$[ $sum + $i ]
    8. done
    9. echo $sum
    10. #用while做一个实现
    11. a=1
    12. while [ $a -le $1 ]
    13. do
    14. sum2=$[ $sum2 + $a ]
    15. a=$[ $a + 1 ]
    16. done
    17. echo $sum2
    18. [root@hadoop scripts]# . sum_to.sh 100
    19. 5050
    20. 5050

    更简单语法用shell内嵌命令let

    1. [root@hadoop scripts]# vim sum_to.sh
    2. #用while做一个实现
    3. sum2=0
    4. a=1
    5. while [ $a -le $1 ]
    6. do
    7. # sum2=$[ $sum2 + $a ]
    8. # a=$[ $a + 1 ]
    9. let sum2+=a
    10. let a++
    11. done
    12. echo $sum2
    13. [root@hadoop scripts]# . sum_to.sh 100
    14. 5050
    15. 5050

  • 相关阅读:
    深入探索JVM高效并发 — Java与线程之状态转换
    WebDAV之葫芦儿·派盘+纸间书摘
    90行代码写一个视频播放器
    视频编解码学习之一:理论基础
    爽,我终于实现了selenium图片滑块验证码!【附代码】
    【JAVA - List】差集removeAll() 四种方法实现与优化
    利用 Google Artifact Repository 构建docker 镜像仓库
    Redis command timed out 处理(InsCode AI 创作助手)
    简单工厂,工厂方法,抽象工厂模式
    开放式无线运动耳机哪个好,几款最好的运动耳机推荐
  • 原文地址:https://blog.csdn.net/m0_55834564/article/details/126435699