162 lines
2.7 KiB
Markdown
162 lines
2.7 KiB
Markdown
---
|
|
title: 2.2、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
|
|
<!-- more -->
|
|
举例
|
|
```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
|
|
```
|
|
被引入的文件并不需要可执行权限 |