shell学习之for循环语句初学者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell学习之for循环语句初学者相关的知识,希望对你有一定的参考价值。

前言:日常系统管理工作中有大量需要重复运行的指令,shell编程提供了forwhileuntilselect循环语句以实现特定指令的反复执行功能,在所有的循环语句中,变量必须要有初始值,每次运行命令序列前都需要对条件进行过滤,满足条件才会运行命令,否则不执行相关操作。下面介绍的就是for循环语句的两种语法格式。

for 循环每次处理依次列表内信息,直至循环耗尽。相对于while、until的循环方式是必须符合某个条件的状态,for这种语法是已经知道要进行几次循环的状态。

 

语法格式1

for 变量 in 1  2  3....

do

   执行程序

done

说明:for语句通过对变量的定义取值决定循环的执行次数,根据变量赋值的次数,for循环内的指令将被执行相同的次数,如定义一个变量i取值为234,则最终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循环语句初学者的主要内容,如果未能解决你的问题,请参考以下文章

Scala基础学习之for循环和while循环

shell学习之编程基础知识

lua学习之for循环

Python 学习之for与break的用法

python3学习之for循环

python学习之条件语句(if循环)