{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-01-21 12:32:21","updateBy":"admin","updateTime":"2025-06-16 20:17:41","remark":null,"id":45,"articleTitle":"Shell（四）流程控制","articleUrl":"shell_flow_control","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"所有的编程语言中都会涉及到流程控制，条件判断与循环，shell也不例外。shell中有四种流程控制语句，分别是条件判断（if，case）与循环（for，while）。","articleContent":"所有的编程语言中都会涉及到流程控制，条件判断与循环，shell也不例外。shell中有四种流程控制语句，分别是条件判断（if，case）与循环（for，while）。\n\n## if条件判断\n\n### 单分支\n\n```bash\nif [ 条件表达式 ];then\n\t程序\nfi\n或者\nif [ 条件表达式 ]\nthen\n\t程序\nfi\n```\n\n简单示例，需要注意的是if后面需要加空格\n\n```bash\n#如果命令较短，也可以写在一行内，同样用分号隔开\n[root@l1 ~]# a=18\n[root@l1 ~]# if [ $a -lt 20 ];then echo OK; fi\nOK\n[root@l1 ~]# a=22\n[root@l1 ~]# if [ $a -lt 20 ];then echo OK; fi\n[root@l1 ~]# \n```\n\n写在脚本中，实现我们输入一个变量值，然后输出对应的结果。\n\n```bash\n[root@l1 ~]# cat hello.sh \n#!/bin/bash\nif [ $1 = xiaoming ];then\necho \"hello $1!\"\nfi\n[root@l1 ~]# ./hello.sh \n./hello.sh: 第 2 行:[: =: 期待一元表达式 #如果我们不输入变量而直接执行脚本的话，会有报错，为了解决这个问题，我们可以做如下修改。\n[root@l1 ~]# cat hello.sh \n#!/bin/bash\nif [ \"$1\"x = \"xiaoming\"x ];then # 可以在变量及字符串后加一个字母x，这样即使不输入变量也不会报错了。\necho \"hello $1!\"\nfi\n[root@l1 ~]# ./hello.sh \n[root@l1 ~]# ./hello.sh xiaohong\n[root@l1 ~]# ./hello.sh xiaoming\nhello xiaoming!\n```\n\n### 多分支\n\n```bash\nif [ 条件表达式 ];then\n\t程序\nelseif [ 条件表达式 ];then # 或者也可以简写为elif\n\t程序\nelseif [ 条件表达式 ];then\n\t程序\n...\nelse\n\t程序\nfi\n```\n\n## case语句\n\n语法\n\n```bash\ncase $变量名 in\n\"值1\")\n\t程序1 # 如果变量的值为值1，则执行程序1\n;;\n\"值2\")\n\t程序2 # 如果变量的值为值2，则执行程序2\n;;\n...... # 省略其他程序\n*)\n\t程序n # 如果变量的值均不满足以上，则执行程序n\n;;\nesac\n```\n\n**注意事项**\n\n- case行的结尾必须为单词in，每一个模式匹配必须以右括号结束；\n- 双分号表示命令结束，相当于java中的break；\n- 最后的*)表示默认模式，相当于java中的default。\n\n```bash\n#!/bin/bash\ncase $1 in\n1)\n\techo xiaoming\n;;\n2)\n\techo xiaohong\n;;\t\n3)\n\techo xiaohua\n;;\n*)\n\techo \"查无此人\"\n;;\nesac\n\n[root@l1 ~]# ./name.sh 1\nxiaoming\n[root@l1 ~]# ./name.sh 13\n查无此人\n[root@l1 ~]# ./name.sh 2\nxiaohong\n[root@l1 ~]# ./name.sh \n查无此人\n[root@l1 ~]#\n```\n\n## for循环\n\n### 基本语法1\n\n```bash\nfor ((初始值;循环控制条件;变量变化))\ndo\n\t程序\ndone\n```\n\n经典案例，计算1值100间的所有数的和。\n\n```bash\n#!/bin/bash\nfor (( i=1;i<=100;i++))\ndo\n\tsum=$[$sum + $i] # 或者写为 sum=$(($sum + $i)) let sum+=i\ndone\necho $sum\n```\n\n### 基本语法2\n\n```bash\nfor 变量 in 变量1 变量2 变量3...\ndo\n\t程序\ndone\n# 同样也可写在一行中\nfor i in name.sh sum.sh hello.sh;do ls -l $i; done\n[root@l1 ~]# for i in {1..100};do let sum+=i;done;echo $sum\n5050\n```\n\n对于上一篇文章中所说的$*与$@，我们也可以在for循环中使用\n\n```bash\n[root@l1 ~]# cat para.sh \n#!/bin/bash\necho '======$*======'\nfor i in $*\ndo\n\techo $i\ndone\necho '======$@======'\nfor i in $@\ndo\n\techo $i\ndone\n===============================分隔线=======================\n[root@l1 ~]# ./para.sh 1 2\n======$*======\n1\n2\n======$@======\n1\n2\n[root@l1 ~]# cat para.sh \n#!/bin/bash\necho '======$*======'\nfor i in \"$*\"\ndo\n\techo $i\ndone\necho '======$@======'\nfor i in \"$@\"\ndo\n\techo $i\ndone\n[root@l1 ~]# ./para.sh a b c\n======$*======\na b c\n======$@======\na\nb\nc\n# 可以看到如果不加引号的话，两个变量的输出是一样的。如果加了引号的话，$*的输出就变为了一行，这样就理解了前面所说的“$*是把所有的参数看做一个整体，而$@则是把每个参数区分对待。”\n```\n\n## while循环\n\n```bash\nwhile [ 条件判断表达式 ]\ndo\n\t程序\ndone\n```\n\n实现1加到100的案例\n\n```bash\n#!/bin/bash\na=1\nsum=0\nwhile [ $a -le 100 ]\ndo\n\tlet sum+=a\n\tlet a++\ndone\necho $sum\n```\n\n","categoryId":5,"viewCount":658,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}