zoukankan      html  css  js  c++  java
  • Shell 流程控制


    一、if else

    在 sh/bash 里,else 分支没有语句执行,就不要写这个 else


    1.fi

    if 格式:

    if condition
    then
    	command1
    	command2
    	...
    fi
    

    写成一行:

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

    末尾 fi 就是 if 倒过来。


    2.if else

    if else 格式:

    if condition
    then
    	command1
    	command2
    	...
    else
    	command
    fi
    

    3.if else-if else

    if else-if else 格式:

    if condition1
    then
    	command1
    elif condition2
    then
    	command2
    else
    	commandN
    fi
    

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

    a=10 b=20
    if [ $a == $b ]
    then
    	echo "a 等于 b"
    elif [ $a -gt $b ]
    then
    	echo "a 大于 b"
    elif [ $a -lt b ]
    then
    	echo "a 小于 b"
    else 
    	echo "没有符合的条件"
    fi
    

    输出结果:

    a 小于 b
    

    if else 经常与 test 命令结合使用。

    实例:

    num1=$[2*3]
    num2=$[1+5]
    if test $[num1] -eq $[num2]
    then
    	echo "两个数字相等"
    else
    	echo "两个数字不等"
    fi
    

    输出结果:

    两个数字相等
    


    二、for循环

    for 格式:

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

    写成一行:

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

    实例:

    for loop in 1 2 3 4 5
    do 
    	echo "值是:$loop"
    done
    

    执行结果:

    值是: 1
    值是: 2
    值是: 3
    值是: 4
    值是: 5
    


    三、while语句

    while 用于不断执行一系列命令。

    也用于从输入文件中读取数据。

    while condition
    do 
    	command
    done
    

    实例:

    int=1
    while(( $int <= 5 ))
    do
    	echo $int
    	let int++
    done
    

    运行输出:

    1
    2
    3
    4
    5
    

    Bash let 命令,用于执行一个或多个表达式,变量计算中不需要加 $ 来表示变量。


    echo "按 Ctrl+D 结束输入。"
    echo -n "输入你最喜欢的人:"
    while read Name
    do 
    	echo "$Name"
    done
    

    运行输出:

    输入你喜欢人的名字:wangke
    wangke
    

    1.无限循环

    while
    do
    	command
    done
    

    while true
    do
    	command
    done
    

    for (( ; ; ))
    


    四、until循环

    until不断执行一些列命令直至条件为 true 结束。

    untilwhile刚好相反。

    一般 while循环优于until循环。

    until condition
    do
    	command
    done
    

    condition 的值为 false,继续执行循环语句,否则跳出循环。

    实例:

    a=0
    until [ ! $a -lt 10 ]
    do
    	echo $a
    	a=` expr $a + 1 `
    done
    

    运行结果:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    1.case...esac

    case...esac 为多选择语句。与其他语言中的 switch...case 类似。

    每个 case 分支用右括号开始,用两个;;表示break,即执行结束

    case 值 in
    模式1)
    	command1
    	command2
    	...
    	commandN
    	;;
    模式2)
    	command1
    	command2
    	...
    	commandN
    	;;
    esac
    

    case 值后面必须是 in每种模式以右括号结束。值与模式匹配后,里面的命令开始执行直至;;

    没有匹配,使用*捕获该值,再执行后面的命令。

    实例:

    echo "输入 1 到 3 之间的数字"
    echo "你输入的是:"
    read Num
    case $Num in
    	1) echo "你输入的是1"
    	;;
    	2) echo "你输入的是2"
    	;;
    	3) echo "你输入的是3"
    	;;
    	*) echo "你没有输入 1 到 3 的数字"
    	;;
    esac
    

    运行结果:

    输入 1 到 3 之间的数字
    你输入的是:
    1
    你输入的是1
    


    五、跳出循环

    1.break

    break跳出所有循环(终止后面的所有循环)

    while :
    do
    	echo -n "输入 1 到 3 的数字:"
            read Num
     
    	case $Num in
        
            1|2|3) echo "你输入的数字是:$Num。"
    	;;
     
    	*) echo "你输入的不是 1 到 3 的数字。"
    	break
    	;;
    	esac
    done
    

    运行结果:

    输入 1 到 3 的数字:2
    你输入的数字是:2。
    输入 1 到 3 的数字:3
    你输入的数字是:3。
    输入 1 到 3 的数字:5
    你输入的不是 1 到 3 的数字。
    

    2.continue

    continue不会跳出所有循环,仅跳出当前循环。

    while :
    do
    	echo -n "输入 1 到 3 的数字:"
    	read Num
    	case $Num in
    		1|2|3) echo "你输入的数字是:$Num。"
    		;;
    		*) echo "你输入的不是 1 到 3的数字。"
    			continue
    			echo "游戏结束。"
    		;;
    	esac
    done
    

    运行结果:

    输入 1 到 3 的数字:2
    你输入的数字是:2。
    输入 1 到 3 的数字:5
    你输入的不是 1 到 3 的数字。
    输入 1 到 3 的数字:6
    你输入的不是 1 到 3 的数字。
    输入 1 到 3 的数字:3
    你输入的数字是:3。
    

    当输入大于3的数字,循环不会结束。echo "游戏结束"永远不会执行。

  • 相关阅读:
    博客第8周
    剑指offer 位运算
    真题
    剑指offer分类刷题(转载)
    PV PVC StorageClass是什么?
    k8s使用rbac实现多租户
    ansible-playbook 使用blockinfile 修改/etc/hosts 主机名
    ansible-playbook 一键部署ntp时间同步 yml
    简单搭建一个HTTP文件下载服务器
    常用docker命令备忘
  • 原文地址:https://www.cnblogs.com/keye/p/15232698.html
Copyright © 2011-2022 走看看