和Java、PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):

  1. <?php
  2. if (isset($_GET["q"])) {
  3. search(q);
  4. }
  5. else {
  6. // 不做任何事情
  7. }

    在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else。我们来看下在shell中,if 语句语法格式:

  1. if condition
  2. then
  3. command1
  4. command2
  5. ...
  6. commandN
  7. fi

    写成一行(适用于终端命令提示符):

  1. if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

    末尾的fi就是if倒过来拼写,后面还会遇到类似的。来看下if else 语法格式:

  1. if condition
  2. then
  3. command1
  4. command2
  5. ...
  6. commandN
  7. else
  8. command
  9. fi

    再来看下if else-if else 语法格式:

  1. if condition1
  2. then
  3. command1
  4. elif condition2
  5. then
  6. command2
  7. else
  8. commandN
  9. fi

    以下实例判断两个变量是否相等:

  1. a=10
  2. b=20
  3. if [ $a == $b ]
  4. then
  5. echo "a 等于 b"
  6. elif [ $a -gt $b ]
  7. then
  8. echo "a 大于 b"
  9. elif [ $a -lt $b ]
  10. then
  11. echo "a 小于 b"
  12. else
  13. echo "没有符合的条件"
  14. fi

    输出结果为:

  1. a 小于 b

    if else语句经常与test命令结合使用,如下所示:

  1. num1=$[2*3]
  2. num2=$[1+5]
  3. if test $[num1] -eq $[num2]
  4. then
  5. echo '两个数字相等!'
  6. else
  7. echo '两个数字不相等!'
  8. fi

    输出结果为:

  1. 两个数字相等!

    与其他编程语言类似,Shell支持for循环。for循环一般格式为:

  1. for var in item1 item2 ... itemN
  2. do
  3. command1
  4. command2
  5. ...
  6. commandN
  7. done

    写成一行:

  1. for var in item1 item2 ... itemN; do command1; command2 done;

    当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。例如,顺序输出当前列表中的数字:

  1. for loop in 1 2 3 4 5
  2. do
  3. echo "The value is: $loop"
  4. done

    输出结果为:

  1. The value is: 1
  2. The value is: 2
  3. The value is: 3
  4. The value is: 4
  5. The value is: 5

    顺序输出字符串中的字符:

  1. for str in 'This is a string'
  2. do
  3. echo $str
  4. done

    输出结果为:

  1. This is a string

    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

  1. while condition
  2. do
  3. command
  4. done

    以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。

  1. #!/bin/sh
  2. int=1
  3. while(( $int<=5 ))
  4. do
  5. echo $int
  6. let "int++"
  7. done

    运行脚本,输出:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

    使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令。while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

  1. echo '按下 <CTRL-D> 退出'
  2. echo -n '输入你最喜欢的人名: '
  3. while read FILM
  4. do
  5. echo "是的!$FILM 是一个好人"
  6. done

    运行脚本,输出类似下面:

  1. 按下 <CTRL-D> 退出
  2. 输入你最喜欢的网站名:luyaran
  3. 是的!luyaran 是一个好人

    无限循环语法格式:

  1. while :
  2. do
  3. command
  4. done

    或者:

  1. while true
  2. do
  3. command
  4. done

    或者:

  1. for (( ; ; ))

    until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。until 语法格式一般为:

  1. until condition
  2. do
  3. command
  4. done

    condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

  1. #!/bin/bash
  2.  
  3. a=0
  4.  
  5. until [ ! $a -lt 10 ]
  6. do
  7. echo $a
  8. a=`expr $a + 1`
  9. done

    输出的结果为:

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9

    Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

  1. case in
  2. 模式1)
  3. command1
  4. command2
  5. ...
  6. commandN
  7. ;;
  8. 模式2
  9. command1
  10. command2
  11. ...
  12. commandN
  13. ;;
  14. esac

    case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。下面的脚本提示输入1到4,与每一种模式进行匹配:

  1. echo '输入 1 到 4 之间的数字:'
  2. echo '你输入的数字为:'
  3. read aNum
  4. case $aNum in
  5. 1) echo '你选择了 1'
  6. ;;
  7. 2) echo '你选择了 2'
  8. ;;
  9. 3) echo '你选择了 3'
  10. ;;
  11. 4) echo '你选择了 4'
  12. ;;
  13. *) echo '你没有输入 1 到 4 之间的数字'
  14. ;;
  15. esac

    输入不同的内容,会有不同的结果,例如:

  1. 输入 1 4 之间的数字:
  2. 你输入的数字为:
  3. 3
  4. 你选择了 3

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。首先来看break命令。break命令允许跳出所有循环(终止执行后面的所有循环)。下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令:

  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "输入 1 到 5 之间的数字:"
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "你输入的数字为 $aNum!"
  8. ;;
  9. *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
  10. break
  11. ;;
  12. esac
  13. done

    执行以上代码,输出结果为:

  1. 输入 1 5 之间的数字:3
  2. 你输入的数字为 3!
  3. 输入 1 5 之间的数字:7
  4. 你输入的数字不是 1 5 之间的! 游戏结束

    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。对上面的例子进行修改:

  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "输入 1 到 5 之间的数字: "
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "你输入的数字为 $aNum!"
  8. ;;
  9. *) echo "你输入的数字不是 1 到 5 之间的!"
  10. continue
  11. echo "游戏结束"
  12. ;;
  13. esac
  14. done

    运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句echo "游戏结束"永远不会被执行。

    case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

    shell 中的 for 循环不仅可以用上面所述的方法。对于习惯其他语言 for 循环的朋友来说可能有点别扭。

  1. for((assignment;condition:next));do
  2. command_1;
  3. command_2;
  4. commond_..;
  5. done;

    如上所示,这里的 for 循环与 C 中的相似,但并不完全相同。通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:

  1. #!/bin/bash
  2. for((i=1;i<=5;i++));do
  3. echo "这是第 $i 次调用";
  4. done;

    执行结果为:

  1. 这是第1次调用
  2. 这是第2次调用
  3. 这是第3次调用
  4. 这是第4次调用
  5. 这是第5次调用

    与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。

    好啦,本次分享到这里就算是结束了。如果感觉不错的话,请多多点赞支持哦。。。

  原文链接:https://blog.csdn.net/luyaran/article/details/80079004

shell重温---基础篇(流程控制&if判断&for&while&循环操作)的更多相关文章

  1. shell重温---基础篇(shell变量&字符串以及git GUI运行shell脚本方式)

    既然是基础篇那肯定是需要对shell的各种需要注意的基本点进行说明了.接下来就是show time...    shell呢,是一个用C语言编写的应用程序,是用户使用linux的桥梁.所以呢,他既是一 ...

  2. shell重温---基础篇(参数传递&echo命令)

    经过前两天的学习,关于shell的基础算是知道的一般般啦,最起码不算是小白了(纯属意淫).今天就来点干货哈.   首先是运行shell脚本时的参数传递.脚本内获取参数的格式为$n.n代表了一个数字,例 ...

  3. shell重温---基础篇(shell数组&数组操作)

    上篇博客已经分析重温了shell的运行方式以及其中的变量还有字符串,之后按照套路就是数组方面了,废话不多说,直接进入正题哈.(小白笔记,各位看官勿喷...)     bash shell呢,支持一位数 ...

  4. shell重温---基础篇(printf命令&test命令)

    在shell中还有一个输出的命令,那就是printf了.它模仿的是C程序库(library)里的printf()程序,是由POSIX标准所定义,所以嘞,使用printf脚本比echo移植性要好一点,它 ...

  5. shell重温---基础篇(文件包含)

        和其他语言一样,Shell 也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间 ...

  6. shell重温---基础篇(连接数据库)

    前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...

  7. shell重温---基础篇(函数操作)

        linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.shell中函数的定义格式如下: [ function ] funname [()] { action; [ret ...

  8. shell重温---基础篇(输入/输出重定向)

        大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准 ...

  9. Python基础之流程控制if判断

    目录 1. 语法 1.1 if语句 1.2 if...else 1.3 if...elif...else 2. if的嵌套 3. if...else语句的练习 1. 语法 1.1 if语句 最简单的i ...

随机推荐

  1. 利用Docker volume修改Nginx Docker镜像里index.html

    通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...

  2. LeetCodeOJ刷题之14【Longest Common Prefix】

    Longest Common Prefix Write a function to find the longest common prefix string amongst an array of ...

  3. OC typedef(起别名)

    // #define Integer int // 给基本数据类型起别名 void test() { typedef int Integer; typedef Integer MyInteger; t ...

  4. DSL-领域特定语言(英语:domain-specific language、DSL)

    领域特定语言(英语:domain-specific language.DSL)指的是专注于某个应用程序领域的计算机语言.

  5. pthread使用

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/CreatingTh ...

  6. 【洛谷5287】[HNOI2019] JOJO(主席树优化KMP)

    点此看题面 大致题意: 每次往一个字符串末尾加上\(x\)个字符\(c\),或者回到某一历史版本,求\(KMP\)的\(\sum Next_i\). 问题转化 考虑到可以离线. 于是,我们就可以用一个 ...

  7. Python语言程序设计基础(5)—— 函数和代码复用

    lambda sum = lambda x,y : x + y print(sum(3,3),type(sum)) 默认参数 def prints(str,times = 2) : print(str ...

  8. ROS编译工作区缺少cv_bridge的问题解决

    cv_bridge是OpenCV与ROS之间的格式转换桥梁,编译工作区时遇到报错(目标不存在),直接将cv_bridge包复制到指定的目录即可. 下载地址:https://github.com/ros ...

  9. js 原生获取Class元素

    function getElementsByClassName(n) { var classElements = [] allElements = document.getElementsByTagN ...

  10. 【luogu P1113 杂务】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...