## shell编程之流程控制 ##
```
概述:
流程控制在每一门编程语言里面都有,无论是低级语言还是高级语言,这个是我们日常中最基础的操作,在shell脚本中也不例外,今天我们谈谈流程控制。
```
### shell之if ###
```
语法结构:
if condition1
then
conmand1
command2
...
[elif] condition2
[then]
command3
...
[else]
command4
...
fi
notice:
跟其他语言的if差不多,可以把每一块代码,看成是一个分支,这个字每个流程就很清楚了。当condition1满足的话,就去找他后边的then中的代码块去执行,如果condition1不满足,再去看下一个分支。都不满足执行else
```
代码测试:
```
我们以查找某个用户为例进行测试:
首先查看下我们系统的用户,全部的用户是放在/etc/passwd这个文件的,我们将用户名筛选出来:
cat /etc/passwd | awk -F: ''
命令解释:
awk一个文本处理的,感兴趣的可以去学一下,我这里介绍我里面有的
-F: 指明:作为分隔符
$1: 代表的是分隔后的第一个域
我们在找一下我们要测试的用户test,只要将上述的命令通过管道给grep就好了:
cat /etc/passwd | awk -F: '' | grep "test"
命令解释:
grep帮助我们筛选出含有test的行
我这里是什么都没有输出的,之后创建我们的脚本如下:
```
测试代码:
```
#!/bin/bash
if cat /etc/passwd |grep "test"
then
echo "test user exists"
else
echo "no this user"
fi
notice:
注意默认的是没有权限的,先加权限在执行
```
运行代码:
```
结果:
no this user
```
现在我们开始创建用户:
```
useradd test #请确保你有足够的权限
之后我们在通过上边的那个用户查看下当前用户是否有test:
cat /etc/passwd | awk -F: '' | grep "test"
结果:
test(说明当前有这个用户了)
```
我们在运行我们的脚本,结果如下:
```
test user exists
```
到此if语句介绍结束
---
### shell编程之for循环: ###
```
语法如下:
for item in a b c d e
do
command
done
研究一下for:
首先我们看到in后边是空格分隔的一系列字符,我们想大概是用空格符分隔的一个list,我们可以去猜想是不是只要是空白符就会认为是一项。我们可以进行尝试,发现就是空白符就行分割的,但是换行不行。
```
测试代码:
```
#!/bin/bash
for a in h e l l o
do
echo $a
done
```
```
其实吧,是IFS这个环境变量在作怪,我们可以修改其然后使用其他分割。我们测试下回车分割。
```
测试代码:
```
我们输出/etc/passwd中的每一行。
#!/bin/bash
IFS=$'\n'
i=0
for a in `cat /etc/passwd`
do
echo $i
echo $a
i=$[ $i +1 ]
done
```
坑:
```
在测试:分割的时候,我使用如下代码测试结果比较奇怪:懂原因的可以给我回复下,小弟非常感谢。
IFS=$':'
test="a:b:c:d:"
for a in $test#当在$test的位置直接放a:b:c:d的时候输出为a b c d很奇怪
do
echo $a
done
```
另一中c语言风格的for
```
语法格式:
for((i=0;i
do
command
done
```
### while语句 ###
```
语法格式:
while condition
do
conmmand
done
```
condition:
```
测试命令和平时我们语言所使用的不太一样,测试成功的话,返回0,失败返回非0
测试命令的两种结构:
test expression
expression是一个表达式,可以进行算数和文本的比较
[ expression ]#记得前后都有一个空格
```
测试代码:
```
#!/bin/bash
i=0
while [ $i -lt 9 ]
do
echo $i
i=$[$i+1]
done
```
### until ###
```
语法格式:
until condition
do
command
done
```
测试代码:
```
#!/bin/bash
i=0
until [ $i -gt 8 ]
do
echo $i
i=$[$i+1]
done
```
### case ###
```
这是应该也是分之处理的,语法格式:
case value in
模式1)
command1
command2;;#注意在命令的结束是两个;
模式2)
command1
command2;;
*)#匹配其他的
command1
command2;;
esac
```
测试代码:
```
#!/bin/bash
a=tesddsat
case $a in
"test")
echo "testtest"
echo 1;;
"test11")
echo "testtest"
echo 2;;
*)
echo "3";;
esac
```
### 退出循环 ###
```
退出循环包括两个命令:
continue#退出一次
break#z终止循环
```
测试代码:
```
任务进行一个1~10的循环,每次循环获取用户输入,得到m跳过一次循环,得到n终止循环
#!/bin/bash
for((i=0;i
do
read test
if [ $test == m ]#注意此处的比较==前后记得加空格,要不然和预期的不一样
then
echo "enter $test"
continue
echo "mmmmmmmmm"
elif [ $test == n ]
then
echo "enter $test"
break
echo "nnnnnn"
fi
echo $i
done
```
**既然都看到这儿了,老铁关注一波吧,小弟谢过了**
领取专属 10元无门槛券
私享最新 技术干货