【Shell】20天学会shell脚本命令(5)FOR循环条件语句

一、问题

1.1、环境
电脑环境:Windows 10;
JDK环境: Jdk1.8;
Docker版本:Server Version: 19.03.3

1.2、问题
如何在shell脚本中使用For循环?

二、解答

2.1、基本知识;

2.2、实战
1、用for循环打印1到15个数字;
①、首先我们了解下seq的用法:
seq是序列号的意思,在linux系统中输入:

seq 1 15

就可以打印1到15,这15个数字;
所以seq的格式就是:

seq startNum  endNum

截图如下:
在这里插入图片描述
如果,我们不写开始的数字,seq后面只有一个数字会怎么样呢?

seq 15

那么,我们同样会打印1到15,这15个数字,所以,seq默认是从1开始的;
在这里插入图片描述
如果,我们不要从0开始,必须制定开始的数字:
在这里插入图片描述
那么,这个间隔怎么控制呢?为什么每次都是以1递增呢?
对于增量,我们可以用这样的表达命令来控制:

seq startNum incrementNum endNum

在这里插入图片描述
更多的seq知识,大家可以参考这篇博客:(转)shell脚本之seq命令

②、如何使用for循环呢?for循环的格式是:
格式:

for 变量 in  字符串		
do			
    语句1		
done

实例:
1、用for循环打印1到15个数字;
我们新增一个testFor.sh的文件,内容如下(注意,in后面的,seq 15外面包裹的,不是单引号,而是Tab键上面的,Esc键下面的那个键,是反单引号,反单引号表示,包裹的内容是一个命令):

#!/bin/bash
#For循环
#格式:For 变量 in  字符串
#		    do
#			语句1
#			done

for i in `seq 15`
do
	echo "NUM is $i"
done

截图:
在这里插入图片描述
那有朋友会问了,一定要单个变量一定要写i么?这个是不一定的,你可以自己命名,例如:

#!/bin/bash
#For循环
#格式:For 变量 in  字符串
#		    do
#			语句1
#			done

for item in `seq 15`
do
	echo "NUM is $item"
done

打印的结果是一样的;

2、打印1-100的和
①、这里补充一个知识,就是expr命令,这个命令是表达式的意思,express;express后面跟的是数学运算(符号和数字之间一定要有空格),例如,在Linux命令行输入:

expr 1 + 1

我们得到结果:
在这里插入图片描述
减法:
在这里插入图片描述
乘法,乘法需要注意,乘法的乘号和星号是一样的,必须使用转义字符:反斜杠,否则系统会把【*】当成星号来理解:
在这里插入图片描述
如果没有转移字符,会报错:
在这里插入图片描述
如果数字和运算符号之间没有空格,系统会将你输入的内容作为字符串来理解:
在这里插入图片描述
计算1到100的实例代码如下:

#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
	SUM=`expr $i + $SUM`
done
echo $SUM

截图:
在这里插入图片描述
大家可以看到,上面的图片打印了两个结果,第一个结果是expr表达式里,加号左右没有空格,他就将表达式当成字符串来拼接了,而第二个结果才是最终的结果;
利用这个字符串拼接的这个特性,我们可以修改下上面的内容:

#!/bin/bash
SUM=0
EXPR=0
for((i=1;i<=100;i++))
do
	EXPR=`expr $i+$EXPR`
	SUM=`expr $i + $SUM`
done
echo "$EXPR = $SUM"

我们可以将计算公式打印出来:
在这里插入图片描述
还要注意的是,我们这次,没有使用for i in NUM这种表达式;而是使用了Java代码中最常见的for循环表达式的写法,那么Java中,其他for循环表达式,shell能否识别并执行呢?我们试了试,好像是不行的,大家可以自己试试;

3、知道某些共性的文件,然后批量打包,比如将我所有的shell脚本打包:
代码:

#!/bin/bash
for i in `find ./ -name "*.sh" `
do
	tar -czf 2020-01-05.tgz $i
done
echo "shell script is compressed at [`pwd`] "

截图:
在这里插入图片描述
这里,我们可以看到,我们将所有.sh结尾的shell脚本都打包到压缩包2020-01-05.tgz里面去了;for循环的反单引号是执行命令的意思,我们用find命令去查找,查找的目录是当前目录(./),查找的依据是根据名字(-name);tar命令是打包的命令,-czf是tar的打包命令参数,具体的tar打包命令,可以参考这篇博客:Linux下的tar压缩解压缩命令详解

然后我们新增一个tarTemp文件夹(mkdir tarTemp),然后把打包的tgz文件解压到tarTemp文件夹里:

tar -xzf 2020-01-05.tgz  -C ./tarTemp/ 

然后我们到tarTemp文件夹里,发现,只有最后一个shell脚本,其他的脚本都没有,很明显,这是被最后一个脚本给覆盖了;
在这里插入图片描述
那么,我们该如何改脚本呢?
我们写一个if判断条件,如果不存在这个包,我们就创建一个新的压缩包,如果存在了,我们就向这个压缩包里追加新的文件:

#!/bin/bash
for i in `find ./ -name "*.sh" `
do
	if [[ -z 2020-01-05.tgz ]]; then
		tar -cvf 2020-01-05.tgz $i
	else
		tar -rvf 2020-01-05.tgz $i
	fi
	
done
echo "shell script is compressed at [`pwd`] "

截图(tar命令会将压缩的文件都打印出来):
在这里插入图片描述
然后,我们再去tarTemp文件夹里看看,我们是否压缩完毕(tar命令中的-C表示解压到某个目录):
在这里插入图片描述
成功!
本篇说明内容完毕;

三、总结

欢迎关注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公众号:幕桥社区
在这里插入图片描述
知乎:张牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
简书: https://www.jianshu.com/u/02c0096cbfd3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值