5.4 Shell 流程控制

5.4 Shell 流程控制

5.4.1 分支结构 - if

if  condition
then
    statement1
elif condition2
then
    statement2
else
    statement3
fi
  • ==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的,大家要习惯。
  • 其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记。

5.4.2 分支结构 - case in

它的基本格式如下:

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ……
    *)
        statementn
esac
  • case 、 in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。

expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。

  • case 会将 expression 的值与 pattern1 、 pattern2 、 pattern3 逐个进行匹配:

如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
如果 expression 没有匹配到任何一个模式,那么就执行 *) 后面的语句(* 表示其它所有值),直到遇见双分号 ;; 或者 esac 才结束。*) 相当于多个 if 分支语句中最后的 else 部分。

  • 如果你有 C 语言、 C++ 、 Java 等编程经验,这里的 ;; 和 *) 就相当于其它编程语言中的 break 和 default。

  • 对 *) 的几点说明:

Shell case in 语句中的 *) 用来“托底”,万一 expression 没有匹配到任何一个模式,*) 部分可以做一些“善后”工作,或者给用户一些提示。
可以没有 *) 部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。

5.4.3 while 循环

Shell while 循环的用法如下:

while condition
do
    statements
done

condition 表示判断条件,statements 表示要执行的语句(可以只有一条,也可以有多条),do 和 done 都是 Shell 中的关键字。

while 循环的执行流程为:

  1. 先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。
  2. 每一次执行到 done 的时候都会重新判断 condition 是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。
  3. 如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

while 语句和 if else 语句中的 condition 用法都是一样的,你可以使用 test 或 [] 命令,也可以使用 (()) 或 [[ ]]

5.4.4 until 循环

unti 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。

until 的使用场景很少,一般使用 while 即可。

shell until 循环的用法如下:

until condition
do
    statements
done

5.4.5 C 语言风格的 for 循环

C 语言风格的 for 循环的用法如下:

for((exp1; exp2; exp3))
do
    statements
done
  • exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 的结果来决定是否继续下一次循环;

5.4.6 Python 风格的 for in 循环

Python 风格的 for in 循环的用法如下:

for variable in value_list
do
    statements
done

variable 表示变量,value_list 表示取值列表, in value_list 部分可以省略,省略后的效果相当于 in $@

对 value_list 的说明

  1. 直接给出具体的值
    可以在 in 关键字后面直接给出具体的值,多个值之间以空格分隔,比如 1 2 3 4 5 、“abc” “390” "tom"等。

  2. 给出一个取值范围
    给出一个取值范围的具体格式为:{start..end}

  3. 使用命令的执行结果
    使用反引号``或者$() 都可以取得命令的执行结果, 比如 for n in $(seq 2 2 100)

  4. 使用 Shell 通配符
    Shell 通配符可以认为是一种精简化的正则表达式,通常用来匹配目录或者文件,而不是文本, 如 for filename in *.sh

  5. 使用特殊变量
    Shell 中有多个特殊的变量,例如 $#、$* 、$@、$?、$$ 等

5.4.7 select in 循环

select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。

Shell select in 循环的用法如下:

select variable in value_list
do
    statements
done

variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。你看,select in 和 for in 的语法是多么地相似。

5.4.8 break 和 continue

Shell 中 break 和 continue 与 C 语言中最大不同在于: 可以使用参数 n 表示退出循环的层数

break n
continue n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值