shell学习之for循环语句初学者
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell学习之for循环语句初学者相关的知识,希望对你有一定的参考价值。
前言:日常系统管理工作中有大量需要重复运行的指令,shell编程提供了for、while、until、select循环语句以实现特定指令的反复执行功能,在所有的循环语句中,变量必须要有初始值,每次运行命令序列前都需要对条件进行过滤,满足条件才会运行命令,否则不执行相关操作。下面介绍的就是for循环语句的两种语法格式。
for 循环每次处理依次列表内信息,直至循环耗尽。相对于while、until的循环方式是必须符合某个条件的状态,for这种语法是已经知道要进行几次循环的状态。
语法格式1:
for 变量 in 值1 值2 值3....
do
执行程序
done
说明:for语句通过对变量的定义取值决定循环的执行次数,根据变量赋值的次数,for循环内的指令将被执行相同的次数,如定义一个变量i取值为2、3、4,则最终for循环将循环执行命令三次。for语句的语法格式1对变量的赋值通过在in后面直接赋值,多个赋值通过空格隔开。当变量值在列表里,for循环即执行一次所以命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。
in列表可以包含替换、字符串和文件名
in列表是可选的,如果不用它,for循环使用命令行的位置参数。
简单for循环例子
例1:按顺序输出列表中的数字:
[[email protected] sh]# vi for1.sh [[email protected] sh]# cat for1.sh #!/bin/bash for i in 1 2 3 4 5 ##i是变量,1 2 3 4 5是赋值给变量i do echo $i done [[email protected] sh]# ./for1.sh ##执行结果 1 2 3 4 5
也可以在循环体重结合使用变量名跟字符串,如下。
echo "The value is: $i" 输出结果: The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5
例2:打印字符串列表
下面for循环中,列表包含字符串“orange red blue grey”,命令为echo,变量名为loop,
echo命令使用$loop反馈出列表中所有取值,直至列表为空。
[[email protected] sh]# vi forloop.sh [[email protected] sh]# cat forloop.sh #!/bin/bash for loop in orange red blue grey do echo $loop done [[email protected] sh]# ./forloop.sh ##执行结果 orange red blue grey ##在循环体重结合使用变量名跟字符串
例3:简易批量解压缩脚本(这里脚本替换成批量查询文件数量)
[[email protected] sh]# vi for2.sh [[email protected] sh]# cat for2.sh #!/bin/bash cd /mnt/sh/ ##先进入到对应目录下 ls *.sh > ls.log ##在sh目录下,列出以.sh结尾的所有文件,覆盖到ls.log文件中(这里使用覆盖,而不是追加,是因为还不确定ls.log这个文件是否真实存在,如果有就会影响程序执行,所以使用覆盖) y=1 ##设置变量y=1 for i in $(cat ls.log) ##为变量i赋值 cat ls.log的输出结果 do echo $y ##输出变量y值,输出一个结果就给y赋值1 y=$(( $y + 1 )) ##变量y=变量y+1(双小括号,才能进行加减乘除运行算) done [[email protected] sh]# ./for2.sh ##执行结果 1 2 3 4 5 6 7 8 [[email protected] sh]# ls ##校验执行结果查看有多少.sh结尾的文件 for1.sh for2.sh for3.sh for4.sh if1.sh if2.sh if3.sh if4.sh ls.log [[email protected] sh]#
可以修改为打印当前目录下的所有文件
[[email protected] sh]# cat for5.sh #!/bin/bash for i in `ls ` do echo $i done [[email protected] sh]# ./for5.sh for1.sh for2.sh for3.sh for4.sh for5.sh if1.sh if2.sh if3.sh if4.sh ls.log
语法格式2:
for (( 初始值;循环控制条件;变量变化))
do
执行程序
done
说明:语法格式2则是首先通过初始化变量的值,也就是定义一个变量的初始值,然后通过运算修改变量的值,当结束循环的条件满足时,for循环结束。
初始值:某个变量在循环前的起始值,直接以类似i=1的方式设置好。
循环控制条件:当变量值在这循环控制范围内就可以继续执行。例如i<=100
变量变化:每做一个循环时变量的变化。例如:i=i+1
值得注意的是,在“变量变化”的设置上,如果每次都加1,可以使用类似“i++”的方式,即i每次循环都会增加1。可以以这种方式来进行1累加到100的循环
例1:从1累加到 100的循环
[[email protected] sh]# vi for3.sh [[email protected] sh]# cat for3.sh #!/bin/bash x=0 for (( x=1;x<=100;x=x+1 )) ##先初始值x=1分号在执行循环控制条件判断x<=100的时候,在执行变量变化x=x+1 do y=$(($y+$x)) ##变量y就等于 变量y+变量x done echo "The sum of 1+2+...+100 is:$y" ##当x值小于等于100时,输出变量y等于变量y加变量x的结果 [[email protected] sh]# ./for3.sh The sum of 1+2+...+100 is:5050 ##执行结果 [[email protected] sh]#
例2:批量添加指定数量的用户(if条件判断与for循环结合使用)
[[email protected] sh]# vi for4.sh [[email protected] sh]# cat for4.sh #!/bin/bash read -t 30 -p "input name: " name read -t 30 -p "input num: " num read -t 30 -p "input password: " password if [ ! -z $name -a ! -z $num -a ! -z $password ] then y=$( echo $num | sed ‘s/^[0-9]*$//g‘ ) if [ -z "$y"] then for (( i=1;i<=$num;i=i+1 )) do useradd "$name$i" &> /dev/null echo $password | passwd --stdin "$name$i" &> /dev/null done fi fi [[email protected] sh]# ./for4.sh input name: zhangsan input num: 5 input password: abc123 [[email protected] sh]# ls /home ##去home家目录下查看执行结果,有张三用户说明添加ok lost+found zhangsan1 zhangsan2 zhangsan3 zhangsan4 zhangsan5 [[email protected] sh]#
read -t 30指定三十秒读取时间
read -p "input name: " 设置input name: 为读取值时的提示符
!取反
-z如果这个值为空 则返回真。加上!表示:有值才能执行下面语句。
-a 逻辑与(同时判断)
echo $num | sed ‘s/^[0-9]*$//g‘ :输出变量num结果管道符过滤后,用正则sed判断输出的是否是数字,如果是就会把变量结果替换为空。(在实际生活中,如果你是自己批量添加用户的,并没有那么繁琐,还去判断什么输入用户的个数是否是数字的,这块if语句完全可以省略)
-z "$y" :变量y为空,返回真
i=1;i<=$num;i=i+1 参照 i=1;i<=100;i=i+1 解释
useradd "$name$i" &> /dev/null:创建用户自定义变量名+数字,执行结果导入黑洞
echo $password | passwd --stdin "$name$i" &> /dev/null:输入密码管道给自定义变量名+数字的用户,执行结果导入黑洞
附:read命令简单介绍
read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。
语法:read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时的等待时间(秒)
参数:指定读取值得变量名
本文出自 “NJ小生” 博客,请务必保留此出处http://qingwl.blog.51cto.com/9853378/1919786
以上是关于shell学习之for循环语句初学者的主要内容,如果未能解决你的问题,请参考以下文章