shell 循环与控制 (三)

1、for 命令

for var in list

do 

    commands

done

2、for循环读取列表值

#!/bin/bash

for i in Beijing shanghai Nanjing 
do 
   echo "Province is $i"
done

输出

Province is Beijing
Province is shanghai
Province is Nanjing

 a,b之间的数值,用{a..b}表示,包含a和b。

#!/bin/bash

for i in {1..5}
do 
    echo "Number is $i"
done

输出

Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
#!/bin/bash

for i in {08..11}
do 
    echo "Number is $i"
done

输出

Number is 8
Number is 9
Number is 10
Number is 11

mac中没有,但是linux可以显示两位数的

Number is 08
Number is 09
Number is 10
Number is 11

3、for循环读取变量的值

#!/bin/bash

list="Zhangsan Lisi Mike"

for i in $list
do 
    echo "Name is $i"
done

输出,在shell中会把空格或者tab用来分隔,他们是shell默认的分隔符。

Name is Zhangsan
Name is Lisi
Name is Mike

当然我们也可以自定义分隔符,通过IFS,此脚本中以:分隔,字符串中没有,故作为整体直接输出。

#!/bin/bash
IFS=":"
list="Zhangsan Lisi Mike"

for i in $list
do 
    echo "Name is $i"
done
Name is Zhangsan Lisi Mike
#!/bin/bash
IFS=":"
list="Zhangsan Lisi Mike:hello world"

for i in $list
do 
    echo "Name is $i"
done
Name is Zhangsan Lisi Mike
Name is hello world

4、for循环从命令执行结果读取值

 命令替换,$(要执行的命令)

#!/bin/bash

FILE=$(ls ../test/)

for i in $FILE
do 
    echo "file is $i"
done
file is test1
file is test2
file is test_old
#!/bin/bash

FILE=$(ls ../test/)

for i in $FILE
do 
    if [ -d $i ];then
        echo "$i is dir"
    elif [ -f $i ]; then
        echo "$i is file"
    else
        echo "error"
    fi
done
error
error
error

因为这些文件并不在我们运行的当前目录下,所以输出了一堆error,我们给它添上路径。

#!/bin/bash

FILE=$(ls ../test/)

for i in $FILE
do 
    if [ -d ../test/$i ];then
        echo "$i is dir"
    elif [ -f ../test/$i ]; then
        echo "$i is file"
    else
        echo "error"
    fi
done
test1 is file
test2 is dir
test_old is file

不用变量,直接在for 循环中用命令替换亦可。

#!/bin/bash

for i in $(ls ../test/)
do 
    if [ -d ../test/$i ];then
        echo "$i is dir"
    elif [ -f ../test/$i ]; then
        echo "$i is file"
    else
        echo "error"
    fi
done

读取文件的值

#!/bin/bash

for i in $(cat ../test/test1)
do 
    echo "$i"
done

test1中的内容

test1
zhangsan
lisi
hu nan

 输出,因为我们的分隔符是默认分隔符,空白符(空格,tab,换行),需要修改分隔符。

test1
zhangsan
lisi
hu
nan

修改分隔符为换行符,mac和linux系统下都可使用"\r",还可以IFS=$'\n',注意是单引号,且前面有$.

#!/bin/bash
IFS="\r"
for i in $(cat ../test/test1)
do 
    echo "$i"
done

输出

test1
zhangsan
lisi
hu nan

5、C语言风格的for命令

双括号

for ((a = 1; a < 4; a++))

do

    commands

done

#!/bin/bash

for (( i = 1; i < 4; i++ ))
do 
    echo "next number is: $i"
done

输出

next number is: 1
next number is: 2
next number is: 3

 求1到100的和

#!/bin/bash
sum=0
for (( i = 1; i < 101; i++ ))
do 
    (( sum+=i ))
done
echo "1+2+3+...+100=$sum"

输出:

1+2+3+...+100=5050

6、while循环语法

while command

do 

    commands

done

#!/bin/bash

num=10
while [ $num -lt 13 ]
do 
    echo "number is $num"
    (( num += 1 ))
done 

输出

number is 10
number is 11
number is 12
number is 13
number is 14

7、until命令

until:若不满足command则执行,若满足则退出,和while刚好相反。

until command

do 

    commands

done

#!/bin/bash

num=5

until (( num == 0 ))
do 
    echo "number is $num"
    (( num -- ))
done

输出

number is 5
number is 4
number is 3
number is 2
number is 1

8、控制循环的break指令

#!/bin/bash

for (( i=1;i<=8;i++))
do 
    if (( i== 5 )); then
        break
    else
        echo "number is $i"
    fi
done

输出

number is 1
number is 2
number is 3
number is 4

多层循环嵌套,break默认跳出内层循环,但是加上一个特定数值可以指定跳出层级。

#!/bin/bash

for (( i=1;i<=8;i++))
do 
    for (( j=1;j<=5;j++ ))
    do
        if (( j==3 )); then
            break
        else
            echo "number is $i $j"
        fi
    done
done

输出

number is 1 1
number is 1 2
number is 2 1
number is 2 2
number is 3 1
number is 3 2
number is 4 1
number is 4 2
number is 5 1
number is 5 2
number is 6 1
number is 6 2
number is 7 1
number is 7 2
number is 8 1
number is 8 2
#!/bin/bash

for (( i=1;i<=8;i++))
do 
    for (( j=1;j<=5;j++ ))
    do
        if (( j==3 )); then
            break 2
        else
            echo "number is $i $j"
        fi
    done
done

输出:在break后面写了2,可以跳出两层循环。

number is 1 1
number is 1 2

9、控制循环的continue指令

#!/bin/bash

for (( i=10;i<15;i++ ))
do
    if (( i==13 ));then
        continue
    else
        echo "number is $i"
    fi
done

多层循环嵌套,同break一样,后面也可以加数值。

10、处理循环的输出

将循环的结果不显示到屏幕,而是重定向到文件

#!/bin/bash

for (( i=1;i<5;i++ ))
do
    echo "number is $i"
done > result.txt

result.txt文件若不存在,会被创建,若存在,会覆盖原来的值。文件中内容如下。

number is 1
number is 2
number is 3
number is 4

还可以通过管道等来处理信息,例如将结果包含1的输出出来。

#!/bin/bash

for (( i=1;i<25;i++ ))
do
    echo "number is $i"
done | grep 1

输出

number is 1
number is 10
number is 11
number is 12
number is 13
number is 14
number is 15
number is 16
number is 17
number is 18
number is 19
number is 21

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值