首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux-shell之流程控制

## 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

```

**既然都看到这儿了,老铁关注一波吧,小弟谢过了**

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180504G1H72R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券