Shell流程控制(四)

270 阅读1分钟

一、 条件判断

1. 语法

  • [ condition ] 括号前后需要空格

注意:条件非空即为true,[ stopping ] 返回true,[ ] 返回false

 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 1
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ stopping ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 0

2. 常用条件

  • 整数之间判断

    [ number1 condition number2]

    • = 字符串比较
    • -lt 小于 less than
    • -le 小等于 less equal
    • -eq 等于 equal
    • -gt 大于 greater than
    • -ge 大等于 greater equal
    • -ne 不等于 not equal
  • 按照文件权限进行判断

    [ -r filename ]

    • -r 有读取条件 read
    • -w 有写入条件 write
    • -x 有执行条件 execute
  • 按照文件类型

    [ -f filePath ]

    • -f 文件存在并且是一个常规的文件
    • -e 文件存在
    • -d 文件存在并且一个目录
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ stopping ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 0
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ 23 -gt 22 ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 0
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ 23 -gt 25 ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 1
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ -r calculate.sh ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?
 0
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# [ -d calculate.sh ]
 [root@izwz9eldxtlzr8ehu1fmjbz calculate]# echo $?

二、流程控制

1. if

  • 基本语法
 if [ 条件判断 ]:then
     执行逻辑
 elif[ 条件判断 ]:then
     执行逻辑
 if
 或者
 if[ 条件判断 ]
 then
 执行逻辑
 if
  • 注意

    • 条件判断左右必须是空格
    • if开头,fi结尾
    • if后面又空格
  • 基本使用案例

 #!/bin/bash
 if [ $1 -eq 1 ]
 then
 echo '输入值为:1'
 elif [ $1 -eq 2 ]
 then
 echo '输入值为:2'
 fi
 //结果
 [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processIf.sh 2
 输入值为:2
 [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processIf.sh 1
 输入值为:1

2. CASE 语句

  • 基本语法

    • ;;表示逻辑终止
    • *) 相当于 default
    • case语句终止是相反esac
 case $key in
 "val1")
     执行key = val1 逻辑
 ;;
 "val2")
     执行key = val2 逻辑
 ;;
 ···
 *)
     执行不匹配时默认逻辑
 ;;
 esac
  • 案例说明

    编写一个case条件分支,如果第一个参数为1则输出hello stopping 1,2则输入hello stopping 2其他情况输出default

     #!/bin/bash
     case $1 in
     "1")
             echo "hello stopping 1"
     ;;
     "2")
             echo "hello stopping 2"
     ;;
     *)
             echo "default"
     ;;
     esac
    

    输出结果

     [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processCase.sh 1
     hello stopping 1
     [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processCase.sh 2
     hello stopping 2
     [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processCase.sh 3
     default
    

3. for 循环

  • 基本语法

    语法一

    基本上跟JAVA for循环差不对,把{}换成了dodone

 for((初始值 ; 控制条件 ; 变量变化))
 do
     执行逻辑
 done

语法二

基本上与JAVA foreach循环差不多,把{}换成了dodone

for val in val1 val2 val3 ...
	do
		执行逻辑
    done
  • 案例说明

    • 编写for案例连续打印十次i的值
    #!/bin/bash
    for(( i = 0 ; i < 10 ; i++))
    do
            echo "当前i值="$i
    done
    

    输出结果

    [root@izwz9eldxtlzr8ehu1fmjbz process]# [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processFor.sh
    当前i值=0
    当前i值=1
    当前i值=2
    当前i值=3
    当前i值=4
    当前i值=5
    当前i值=6
    当前i值=7
    当前i值=8
    当前i值=9
    
    • 编写foreach循环读取变量
    #!/bin/bash
    for val in $*
    do
            echo  $val
    done
    
    for val2 in $@
    do
            echo $val2
    done
    

    输出结果

    [root@izwz9eldxtlzr8ehu1fmjbz process]# [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processForeach.sh 1 2 3 4 5
    1
    2
    3
    4
    5
    --------------------------
    1
    2
    3
    4
    5
    

    注意:这里的$@$*没有区别,但是把他们都加上引号作为一个整体的话,$*则会成为一个整体。

    输出结果:

    [root@izwz9eldxtlzr8ehu1fmjbz process]# [root@izwz9eldxtlzr8ehu1fmjbz process]# sh processForeach.sh 1 2 3 4 5
    1 2 3 4 5
    --------------------------
    1
    2
    3
    4
    5
    

4. While循环

  • 基本语法
while[ 条件判断 ]
do
	执行逻辑
done
  • 案例说明

    循环遍历五次,注意这里需要声明i作为变量再进行操作。区别于for循环操作。

    #!/bin/bash
    i=0
    while [ $i -lt 5 ]
    do
            echo $i
            i=$[ $i+1 ]
    done
    

    \