文章目录
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 //输出结果重定向到文件