shell脚本——for循环语句(包含应用案例)

for循环语句

for循环语法结构

列表循环

列表for循环:用于将一组命令执行已知的次数

基本语法结构

#!/bin/bash
for i in a b c 
do
        echo $i
done

for i in { 1..10}
do
        echo $i
done

#!/bin/bash
for i in $(seq 10)
do
        echo $i
done

#!/bin/bash
for i in $(seq 1 2 10)	# 设置步长
do
        echo $i
done

不带列表循环

不带列表的for循环执行时由用户指定参数和参数的个数

基本语法结构

for i
    do
        command 
        commanddone

实例

#!/bin/bash
if [ $# -eq 0 ];then
        echo "Usage: $0 加上参数"
fi
for i
do
        echo $i
done

[root@maomao 3.27]# bash for.sh 1 2 3
1
2
3


#!/bin/bash
zhu=(2 4 6 8 10) 
echo "${zhu[*]}"
fun() { 
local niu=()
for i
do
        niu[j++]=$[ $i * 5 ]
done
echo "${niu[@]}"
}
result=`fun ${ zhu[@]}`
echo "新数组的所有值:${result[@]}"

类C风格的for循环

基本语法结构

for(( expr1;expr2;expr3 ))
    do
        command
        commanddone
for (( i=1;i<=5;i++))
    do
        echo $i
    done


expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出

循环控制语句

  • continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
  • break:打断;马上停止执行本次循环,执行循环体后面的代码
  • exit:表示直接跳出程序

应用案例

九九乘法表

#!/bin/bash
# 方法一
# by stanZ
#!/bin/bash
for ((i=1;i<=9;i++))
do
        for((n=1;n<=$i;n++))
        do  
                echo -n  "$i*$n=`expr $i \* $n` "
        done
        echo
done




#!/bin/bash
# 方法二
# by stanZ
#九九乘法表
for i in `seq 1 9`
do
        for j in $(seq 1 $i)
        do  
                echo -n "$i*$j=$[ $i * $j ]" 
    
        done
        echo
        #let i++
done

直角三角形

#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=$h;i++))
do
        for j in `seq $i`
        do  
        echo -n "*"
        done
        echo
done

等腰三角形

#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=$h;i++))
do
        a=$[ $h - $i ]
        for j in `seq $a`
        do
                echo -n " "
        done

        b=$((2*$i - 1 ))
        for k in `seq $b`
        do
                echo -n "*"
        done
        echo
done

倒等腰三角形

#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=0;i<=$h;i++))
do
    
        for((j=1;j<=$i;j++))
        do  
                echo -n " "
        done

        a=$(( 2*($h-$i) -1 ))
        for((j=$a;j>=1;j--))
        do  
               echo -n "*"
        done
        echo
done


菱形

#!/bin/bash
# by stanZ
read -p "请输入菱形半径:" h
for((i=0;i<=$h;i++))
do
        a=$[ $h -$i ]
        for((j=1;j<=$a;j++))
        do
                echo -n " "
        done

        b=$((2*$i - 1))
        for((k=1;k<=$b;k++))
        do  
                echo -n "*"
        done
        echo
done

for((u=1;u<=$h;u++))
do
        for((n=1;n<=$u;n++))
        do
                echo -n " "
        done

        l=$(( 2*($h-$u)-1 ))
        for((m=1;m<=$l;m++))
        do
                echo -n "*"
        done
        echo
done

空心三角形

#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=h;i++))
do
        a=$[ $h - $i ]
        for((j=1;j<=$a;j++))
        do  
                echo -n " "
        done

        b=$[ 2*$i -1 ]
        for((k=1;k<=$b;k++))
        do  
                if [ $k -eq 1 ];then
                        echo -n "*"
                elif [ $i -eq $h ];then
                        echo -n "*"
                elif [ $k -eq $((2*$i-1)) ];then
                        echo -n "*"
                else
                        echo -n " "
                fi
        done
        echo
done

空心菱形

#!/bin/bash
# by stanZ
read -p "请输入菱形的半径:" h
for((i=1;i<=$h;i++))
do
        a=$[ $h - $i ]
        for((j=1;j<=$a;j++))
        do
                echo -n " "
        done

        b=$[ 2*$i - 1]
        for((k=1;k<=$b;k++))
        do

        if [ $k -eq 1 -o $k -eq $b  ];then
                echo -n "*"
        else
                echo -n " "
        fi
        done
        echo
done

for((u=1;u<=$h;u++))
do
        for((n=1;n<=$u;n++))
        do
                echo -n " "
        done

        c=$((2*($h-$u)-1))
        for((m=1;m<=$c;m++))
        do

        if [ $m -eq 1 -o $m -eq $c ];then
                echo -n "*"
        else
                echo -n " "
        fi

        done
        echo
done

脚本计算1-100奇数和

#!/bin/bash
# 方法1:
sum=0
for i in { 1..100..2}
do
    sum=$[$i+$sum]
done
echo "1-100的奇数和为:$sum"

# 方法2:
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
    let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"

# 方法3:
sum=0
for ((i=1;i<=100;i++))
do
    if [ $[$i%2] -ne 0 ];then
    let sum=$sum+$i
    fi
或者
test $[$i%2] -ne 0 && let sum=$sum+$i

done
echo "1-100的奇数和为:$sum"

# 方法4:
sum=0
for ((i=1;i<=100;i++))
do
    if [ $[$i%2] -eq 0 ];then
    continue
    else
    let sum=$sum+$i
    fi
done
echo "1-100的奇数和为:$sum"

#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    test $[$i%2] -eq 0 && continue || let sum=sum+$i
done
echo "1-100的奇数和是:$sum"

判断所输整数是否为质数

#!/bin/bash
#定义变量来保存用户所输入数字
read -p "请输入一个正整数字:" number

#先排除用户输入的数字1和2
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 2 ] && echo "$number是质数" && exit

#循环判断用户所输入的数字是否质数

for i in `seq 2 $[$number-1]`
    do
     [ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit
    done
echo "$number是质数"

优化思路:没有必要全部产生2~$[$number-1]序列,只需要产生一半即可。

更好解决办法:类C风格完美避开了生成序列的坑
for (( i=2;i<=$[$number-1];i++))
do
        [ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit

done
echo "$number是质数"


# 方法二
#!/bin/bash
read -p "输入一个数字:" num 
if [ $num -eq 1 ];then
        echo "$num不是质数"
        exit 1
elif [ $num -eq 2 ];then
        echo "$num是质数"
        exit 2
fi

for i in `seq 2 $[$num-1]`
do
        if [ $[$num%$i] -eq 0 ];then
                echo "$num不是质数"
                exit 3
        else
                echo "$num是质数"
                exit 4
        fi    
done

批量创建用户

#!/bin/bash
read -p "请输入创建用户的数量:" num
read -p "请输入创建用户的前缀:" frefix
read -p "请输入创建用户的密码:" password

for((i=1;i<=$num;i++))
do
        user=$frefix$i
        useradd $user
        echo "$password" |passwd --stdin $user &>/dev/null
        if [ $? -eq 0 ];then
                echo "$user is created"
        fi

done

测试网段存活主机

#!/bin/bash
# by stanZ
#for i in `seq 254`
#for i in {1..254}
read -p "请输入想检测的网段(默认192.168.188.0):" net 
for((i=1;i<=254;i++))
do
        {    
        if [ -z $net ];then
                ip=192.168.188.$i
                ping -c 3 -W 1 -i 0.2 $ip &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$ip is up." 
                else
                        echo "$ip is donw."
                fi  
        else
                ip=$net.$i
                ping -c 3 -W 1 -i 0.2 $ip &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$ip is up." 
                else
                        echo "$ip is down."
                fi
        fi
        }&	# 放入后台并发执行
done
wait
echo "all finish.."

    原文作者:stan Z
    原文地址: https://blog.csdn.net/Cantevenl/article/details/115266666
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞