打响2018第一炮-shell编程之for循环语句

大家好,先祝大家2018新年快乐~~~~

今天给大家带来的是for循环


1.for循环语句和while循环类似,但是for循环主要是用于执行次数有限的循环而不是守护进程及无限循环,那么for循环的语法如下:

for 变量名 in 变量取值列表
do
	指令
done

在这种for循环语法中,在for关键字后面会有一个变量名,变量名会依次的获取in后面的变量取值列表的内容,每取一个然后循环do 和done之间的部分 也就是指令。 之后再次循环下一个变量取值列表 然后执行do done之间的部分,直到变量取值列表的最后一个值并进入循环体后才结束。


2.第二种语法就是C语言型的for循环语句如下:

for ((exp1;exp2;exp3))
do
	指令
done

例如1:

for ((a=1;a<=10;a++))
do
	echo $a
done

输出结果如下:

[root@yankerp shell]# sh for_check.sh 
1
2
3
4
5
6
7
8
9
10
[root@yankerp shell]#

剖析:

for ((a=1;a<=10;a++)) #a=1 那么a就是1 a<=10 那么1<10 但是不等于10 所以后面a++增加1
do
	echo $a  #第一次输入$a是1 那么第二次 a++ 等于a+1 也就是1+1 第二次输出2 直到a=10
done   #结束

以上的for循环类似于while语句 如下:

a=1
while ((a<=10))
do
	echo $a
	((a++))
done

输出结果如下:

[root@yankerp shell]# sh while.sh 
1
2
3
4
5
6
7
8
9
10
[root@yankerp shell]#

如果希望程序能够持续运行,那么while循环是最好的选择。

如果是限次循环的话,则多用for循环!!!


3、for循环的基础实践

例1:使用for循环打印 1 2 3 4 5 数字如下:

#!/bin/bash
for zhangsan in 1 2 3 4 5
do
        echo $zhangsan
done

剖析如下:


for关键字后面会有一个变量名,变量名会依次的获取in后面的变量取值列表的内容,每取一个然后循环do 和done之间的部分 也就是指令。 之后再次循环下一个变量取值列表 后执行do done之间的部分,直到变量取值列表的最后一个值并进入循环体后才结束。

最后输出内容

[root@yankerp shell]# sh for_check.sh 
1
2
3
4
5
[root@yankerp shell]#


例如2:使用{}来打印1 2 3 4 5

在前几篇文章中有提过{}的用处,例如打印1-15 或者 a-z

[root@yankerp shell]# echo {1..15} 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[root@yankerp shell]# echo {a..z} 
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@yankerp shell]#

使用for循环结合{}循环

[root@yankerp shell]# cat for_check.sh 
#!/bin/bash
for zhangsan in {1..5}   #或者 {a..z}
do
        echo $zhangsan
done
[root@yankerp shell]# sh for_check.sh  
1
2
3
4
5
[root@yankerp shell]#

输出a-z

[root@yankerp shell]# sh for_check.sh 
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
[root@yankerp shell]#


实例3:批量修改文件后缀


我们看到 在这个目录下有这么多文件,但是他们的后缀名不同,但是需求就是我想把以txt格式的文件,都改为.sh的 第一种方法,一条条的手动改,第二种方法如下:

1.首先我们要改后缀名,我们先定义一个变量测试

[root@yankerp data]# aaa=csdn.txt
[root@yankerp data]# echo $aaa
csdn.txt
[root@yankerp data]# echo $aaa | cut -d . -f1 
csdn
[root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".sh
csdn.sh
[root@yankerp data]#

剖析如下:

[root@yankerp data]# aaa=csdn.txt  #定义一个变量 aaa=csdn.txt 那么aaa就是csdn.txt
[root@yankerp data]# echo $aaa#echo $aaa 就是 csdn.txt
csdn.txt        #输出的结果
[root@yankerp data]# echo $aaa | cut -d . -f1 #在这里我们使用cut命令通过.为分隔符截取第一段  
csdn#截出来的csdn 那么我们想,这时候在csdn后面加上一个.sh 是不是就好了 如下:
[root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".sh#在以上的命令后面加上.sh 就实现了这个效果
csdn.sh
[root@yankerp data]#


以上是一个变量的方法,那么接下来编写for循环修改的方式

2.我们是需要把txt后缀改为sh结尾,那么我们肯定是要找出在这里目录下所有以txt文件结尾的文件如下:

[root@yankerp data]# ls | grep txt$
a.txt
b.txt
c.txt
d.txt
uuub.txt
[root@yankerp data]#

到这里我想应该很清楚了,接下来修改的方式和上面变量的方式一样 如下:

#!/bin/bash
cd /root/data || {
        echo "进入目录失败!!!"
        exit 1
}

for zhangsan in `ls | grep txt$`
do
        mv $zhangsan `echo $zhangsan | cut -d . -f1`.sh
done

3.剖析:

#!/bin/bash
cd /root/data || {   #进入文件目录
        echo "进入目录失败!!!"  #判断是否进入成功!!!
        exit 1
}

for zhangsan in `ls | grep txt$`  #张三是一个变量 那么后面跟着那条命令 也就是所有以txt结尾的文件,开始循环
do
        mv $zhangsan `echo $zhangsan | cut -d . -f1`.sh  #这个就是上面的那个变量的命令。
done

修改如下:



实例4:批量解压文件,如下:


在这个目录下我们看到有很多的包,但是有.tar.gz 的 有rar的 有zip的包,但是呢,我就想解压.tar.gz的包,第一种方法,手动一个个解压,那么第二种方式如下:

1.查看以.tar.gz的包有几个


2.编写脚本如下:

#!/bin/bash
cd /root/data || {
        echo "进入目录失败!!!"
        exit 1
}

for zhangsan in `ls | grep .tar.gz$`
do
        tar zxf $zhangsan -C /root/log
done

if [ "$?" -eq 0 ];then
   echo ".tar.gz 成功!!!"
 else
   echo "失败!!!"
fi


运行结果如下:



实例5:开发批量创建用户脚本

首先批量创建用户还是很好实现的,如下:

#!/bin/bash

NAME=yankai
for zhangsan in `seq -w 1 5`
do
        useradd $NAME$zhangsan
done
if [ "$?" -eq 0 ];then
   echo "创建用户成功!!!"
 else
   echo "创建用户失败!!!"
   exit 1
fi

运行如下:


但是问题来了,怎么去给用户加密码,用户是肯定需要密码的,普通我们给一个用户设置密码如下:

[root@yankerp ~]# echo 123456 | passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@yankerp ~]#

我们随机匹配密码可以通过$RANDOM|md5sum进行加密的方式来截取前8位 如下:


那么接下来我们就有一定的思路去写脚本了如下:

#!/bin/bash
. /etc/init.d/functions
NAME=yankai
ZF=`seq 1 10`

for user in $ZF
do
	useradd $NAME$user
	PASS="`echo $RANDOM|md5sum | cut -c 1-8`"

	echo "$PASS" | passwd --stdin $NAME$user &>/dev/null
	echo "$NAME$user的密码为:$PASS"
if [ "$?" -eq 0 ]
   then
	 action "$NAME$user is ok!" /bin/true
   else
	 action "$NAME$user not ok!" /bin/false
	 exit 1
fi
done

执行如下:


剖析如下:

#!/bin/bash
. /etc/init.d/functions   #加载函数库
NAME=yankai		#定义名字为yankai
ZF=`seq 1 10`	#这个取1-10的数字

for user in $ZF		#for循环 user是变量 $ZF取数值
do
	useradd $NAME$user   #创建yankai账户并+1
	PASS="`echo $RANDOM|md5sum | cut -c 1-8`" #定义随机密码 取前8位

	echo "$PASS" | passwd --stdin $NAME$user &>/dev/null	#设置用户密码
	echo "$NAME$user的密码为:$PASS"	   #输出用户密码
if [ "$?" -eq 0 ]		#进行判断
   then
	 action "$NAME$user is ok!" /bin/true
   else
	 action "$NAME$user not ok!" /bin/false
	 exit 1
fi
done        #以上内容一直循环 直到seq 1-10 已经达到了10 那么退出循环!!


案例6:开发检测URL脚本

内容如下:

#!/bin/bash
. /etc/init.d/functions

function URL_Check(){
        wget --spider http://$1 &>/dev/null
                if [ "$?" -eq 0 ];
                   then
                     action "$1 检测成功!" /bin/true
                   else
                     action "$1 检测失败!" /bin/false
                fi
}

web="
www.baidu.com
www.jd.com
www.taobao.com
www.4399.com
www.baidu123.com
www.ywydhajkw.com
www.hahahhaha.conm
www.dhadwkldm.com
"           
            
            
for url in $web 
do         
        URL_Check $url
done

运行结果如下:


以上仅供参考,若写的不好,请见谅,非专业

剖析如下:



最后,再次祝大家新的一年能够开开心心,心想事成,技术越来越牛叉!!!

再见~~~

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...