【shell脚本】for、while、until

1 for

重复执行某种命令直到达到特定条件
for var in list
do
commands
done

总结:
1、in后可以跟具体的值,值与值之前默认用空格分割,遇到引号或者空格,使用转义
2、in后面可以跟变量,先定义变量,再读取变量
3、in后面可以跟命令,使用命令替换,读取命令替换后的值

1.1 读取列表中的值

总结:in后面是具体的值,值与值之前默认用空格分割,遇到引号 遇到空格 要么转义 要么用双引号括起来 才能识别

$cat test1.sh
#!/bin/bash
#for
#
for test in a b c d e f
do
	echo "$test"
done

运行

$./test1.sh
a
b
c
d
e
f

1.2 读取列表中复杂的值

列表中若有单引号的话,用\转义 或者用双引号括起来
for循环的in后面 默认每个值都是用空格分割的,若有空格用双引号括起来

比如:
for test in I don’t know if “this’ll” work
for test in Nevada “New Hampshire” “New Mexico” “New York”

1.3 从变量读取列表

将值存到变量中,遍历变量

$cat test2.sh 
#!/bin/bash
# for
#
list="a b c d e f"
#
for  test in $list
do
	echo $test
done

运行

$./test2.sh
a
b
c
d
e
f

1.4 从命令读取值

可以使用命令读取值,在in后面使用命令替换

$cat test3.sh 
#!/bin/bash
#for
#
for  test_1 in `cat  /home/50485581/test`
do
	echo "$test_1"
done

运行:

$./test3.sh 
1
2
3
4
5
6

1.5 更改字段分隔符

IFS环境变量定义了字段分隔符,,默认设计空格、制表符、换行符
文件内容:
$cat test
new year
2
3
4
5
6

脚本内容:
$cat test3.sh
#!/bin/bash
#for

for test_1 in cat /home/50485581/test
do
echo “$test_1”
done
输出内容
$./test3.sh
new
year
2
3
4
5
6
以上可见,new year被分开输出,原因就是IFS环境变量默认空格作为字段与字段之前的分割

那么改变IFS环境变量命令:
IFS=$’\n’

写入脚本中

#!/bin/bash
#for
#
IFS=$'\n'  //修改环境变量
for  test_1 in `cat  /home/50485581/test`
do
	echo "$test_1"
done

运行

$./test3.sh 
new year
2
3
4
5
6

若脚本中 有一段脚本使用默认值,另外一段脚本使用修改的IFS值,那么可以这样实现

IFS_OLD= I F S I F S = IFS IFS= IFSIFS=’\n’
<使用新的IFS值>
IFS=$IFS_OLD

1.6 用通配符读取目录

2 C语言风格的for命令

$cat test4.sh 
#!/bin/bash
#C
#
for (( i=1;i<=10;i++ ))
do
	echo "next number is $i"
done

运行:

$./test4.sh 
next number is 1
next number is 2
next number is 3
next number is 4
next number is 5
next number is 6
next number is 7
next number is 8
next number is 9
next number is 10

多个变量

$cat test5.sh 
#!/bin/bash
#for
#
for (( a=1,b=10; a<=10;a++,b-- ))
do
	echo "$a - $b"
done

运行:

$./test5.sh 
1 - 10
2 - 9
3 - 8
4 - 7
5 - 6
6 - 5
7 - 4
8 - 3
9 - 2
10 - 1

3 while命令

while:当条件成立,执行语句
until:直到条件成立,才终止语句
while test ommand
do
other ommands
done

例子:

[50485581@shell.testing-studio.com ~]$cat test6.sh 
#!/bin/bash
# while
#
var1=10
#
while [ $var1 -gt 0 ]
do
	echo $var1
	var1=$[ $var1 - 1 ]   //变量必须做改变,不然会是个死循环
done

运行:

$./test6.sh 
10
9
8
7
6
5
4
3
2
1

4 until语句

$cat test7.sh 
#!/bin/bash
#until
#
var1=10
#
until [ $var1 -gt 15 ]
do
	echo $var1
	var1=$[ $var1 +  1 ]
done

运行:

$./test7.sh 
10
11
12
13
14
15

5 嵌套循环

先内循环 ,再外循环

$cat test8.sh 
#!/bin/bash
#loop
#
for (( a=1; a <= 3; a++ ))
do
	echo "outside loop is  $a"
	for (( b=1; b <= 3; b++ ))
	do
		echo "inside loop is $b"
	done
done

运行:

$./test8.sh 
outside loop is  1
inside loop is 1
inside loop is 2
inside loop is 3
outside loop is  2
inside loop is 1
inside loop is 2
inside loop is 3
outside loop is  3
inside loop is 1
inside loop is 2
inside loop is 3

6 循环处理文件数据

$cat  test9.sh 
#!/bin/bash
#for
IFS=$'\n'
for var1 in `cat /etc/passwd`
do
	echo "values is $var1"
	IFS=:
	for var2 in  $var1
	do
	echo "$var2"
	done
done

运行

$./test9.sh
values is 28866960:x:2839:2840::/home/28866960:/bin/bash
28866960
x
2839
2840

/home/28866960
/bin/bash
.................

7 控制循环

不必等到循环完成所有迭代才行,可以进行中间干预,使用break和 continue命令

7.1 break命令

1、跳出单个循环

$cat test10.sh 
#!/bin/bash
#break
#
for var in 1 2 3 4 5 6 7 8 9 10
do
	if [ $var -eq 5 ]
	then
		break
	fi
	echo "number is $var"
done
echo "for loop is completed"

运行:

[50485581@shell.testing-studio.com ~]$./test10.sh 
number is 1
number is 2
number is 3
number is 4
for loop is completed

2、跳出内部循环

$cat test11.sh 
#!/bin/bash
#inner break
#
for (( a=1; a <= 4; a++ ))
do	
	echo "outside is $a"
	for (( b=1; b <= 100; b++ ))
	do
		if [ $b -eq 5 ]
		then
			break
		fi
	
	echo "inner loop is $b"
	done
done

运行:

$./test11.sh 
outside is 1
inner loop is 1
inner loop is 2
inner loop is 3
inner loop is 4
outside is 2
inner loop is 1
inner loop is 2
inner loop is 3
inner loop is 4
outside is 3
inner loop is 1
inner loop is 2
inner loop is 3
inner loop is 4
outside is 4
inner loop is 1
inner loop is 2
inner loop is 3
inner loop is 4

3、跳出外部循环

7.2 continue命令

$cat test13.sh 
#!/bin/bash
#continue
#
for  (( var1=1; var1 <= 15; var1++ ))
do
	if [ $var1 -gt 5 ]   && [ $var1 -lt 10 ]
	then
		continue
	fi
	echo "number is $var1"
done

运行:

$./test13.sh 
number is 1
number is 2
number is 3
number is 4
number is 5
number is 10
number is 11
number is 12
number is 13
number is 14
number is 15

解释:1 2 3 4 5 两个条件不满足,那么执行echo;6条件满足,那么就continue,继续加1,满足条件的继续加1;不满足条件的就echo

8 处理循环的输出

使用管道或者重定向命令 将输出的结果输出到文件中去

$cat test1.sh 
#!/bin/bash
#for
#
for test in a b c d e f
do
	echo "$test"
done  > a.txt  //输出结果重定向到文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值