--- title: shell编程(3)-流程控制&函数 date: 2018-5-6 00:52:22 tags: - linux - shell categories: - linux --- ### 判断 ```bash if condition1 then command1 elif condition2 then command2 else command3 fi ``` 如果else没有语句执行 则不能留空 , 最好直接不写这个else 举例 ```bash if [ `ps ax | grep -c "ssh"` -ge 1 ] then echo "RUNNING" fi # grep的-c参数代表对过滤后的行进行计数 # 也可以使用test命令做判断 if test `ps ax | grep -c "ssh"` -ge 1 then echo "RUNNING" fi ``` ### 循环 #### for循环 ```bash for ((i=1 ; i<=10 ; i++)) do echo $i done # 注意使用(()), 里面的变量并不需要加$ ``` `for (( ; ; ))` - 死循环 ##### foreach bash支持对集合进行迭代的foreach类型语法 使用`for ... in ...` ```bash # seq命令可以生成一个序列 for i in `seq 1 10` do echo $i done # 这样也是一个序列 for i in {1..10} do echo $i done # 迭代遍历一个数组 arr=("ab" "cd" "ef") for item in ${arr[@]} do echo $item done ``` 如果一个命令返回的是一个集合 , 也可以执行循环迭代 ```bash for item in `ls /usr/local` do echo $item done ``` 当然如果是找一个目录下的文件 , 也可以不用ls命令 for循环自带路径查找功能 ```bash for item in /usr/local/* do echo $item done # 注意路径不要加引号 ``` #### while循环 while循环是在判断条件为false的时候结束循环 ```bash cnt=1 while (( $cnt<=5 )) do echo $cnt let "cnt++" done ``` `while :`或者`while true`表示死循环 #### until循环 格式与while循环基本一致 , 只不过是当判断条件为true的时候结束循环 ```bash cnt=1 until (( $cnt>=5 )) do echo $cnt let "cnt++" done ``` #### break与continue 表示跳出循环以及继续下一次循环 , 与其他语言当中类似 ### 多选择语句 类似其他语言当中的switch , bash当中使用case关键字 ```bash echo "input a number:" # read表示从终端读取用户输入内容 read num case $num in 1) echo "数字1" ;; 2) echo "数字2" ;; 3|4) echo "3或者4" ;; ok) echo "字符串ok" ;; *) echo "其他内容" ;; esac ``` ### 函数 shell当中可以自定义函数 ```bash function myFunc() { echo "参数 $1,$2,$3" echo "所有参数:" for arg in $@ do echo $arg done } myFunc "aa" "bb" ``` > **说明** : 1. 与获取脚本的参数类似 , 使用`$序号`或者`${序号}`来获取 但是如果到了10 , 就必须写作`${10}` , 否则会与$1产生歧义 2. `function` 关键字也可以省略 ### 文件包含 一个shell脚本当中可以引入另一个shell脚本 ```bash . /home/sookie/test2.sh # 或者 source /home/sookie/test2.sh ``` 被引入的文件并不需要可执行权限