shell 脚本练习之 for 循环,while循环

shell 脚本练习之 while ,for 循环

1.计算从1到100所有整数的和

方法一:

#!/bin/bash

#设置 变量a 初始值为1 ,
a=1    

#变量sum用来接运算后的值
sum=0    

while [ $a -le 100 ]  #变量a 的 取值范围是 1 -100
do
    sum=$[$a+$sum]    #每次循环,变量sum 重新赋值为 其本身加上变量a 的值
    let a++           #每次循环,变量a 的值加1
done
echo "从1 到 100 的整数和为$sum"

image-20210719113154417



方法二:

sum=0
for i in {1..100}     #变量i 取值,从1 到100
do
    sum=$[$sum +$i]
done
echo "从1 到100 的整数和为 $sum "



方法三

#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    sum=$[$sum +$i]
done
echo "从1 到100 的整数和为 $sum"



2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和(不考虑非整数)

方法一:

#!/bin/bash

sum=0

#将用户的输入,作为变量num的值
read -p "(请输入数字,0~99):" num


[ $num -eq 0 ] && echo "从1 到0 的值为1" && exit  #如果用户输入的值为0,则告诉他值为1,并退出脚本

#用户输入的数字是否在 0 -99 之间
if [[ $num -gt 0 && $num -lt 100 ]];then      

		#变量i 取值为 1  到 $num 之间所有整数
    for i in $(seq 1 1 $num)   #"seq 1 1 $num " 从1 到 整数 $Num ,步长为1
    do
        sum=$[$i+$sum]
    done
    echo "从 1 到 $num 的和是 $sum"
else    #如果用户输入的不是 0-99 的整数,告诉他重新输入
    echo "请正确输入(整数0~100)"
fi

image-20210719114236884



方法二:

#!/bin/bash

#将用户的输入作为变量 num 的值
read -p "请输入数字1~99:" num

[ $num -eq 0 ] && echo "从1 到0 的值为1" && exit


if [[ $num -lt 100 && $num -gt 0 ]];then
    sum=0
    i=0
    while [ $i -le $num ]    # 变量i 值小于 变量 num 值时,条件成立
    do
        sum=$[$i+$sum]
        let i++                 #m每次循环 ,i 值加1
    done
    echo "从1 到 $num 的值是 $sum"
else
    echo "请正确输入(整数0~99)"
fi

3.求从1到100所有整数的偶数和、奇数和

方法一

#!/bin/bash

jisum=0    #用来储存奇数的和
ousum=0    #用来储存偶数的和

for a in $(seq 1 2 100)   #"seq 1 2 100" 从 1 到100, 步长是2 (即,1,3,5,7,9 ....99)
do
    jisum=$[$jisum+$a]   #每次循环,jisum的值为 jisum 原来的值加上 a 的值
done
    echo "奇数和是 $jisum"

for b in $(seq 2 2 100)   #"seq  2 2 100 " 从2 到100 ,步长为2 (即,2,4,6,8,10....100)
do
    ousum=$[$ousum+$b]     #每次循环,ousum的值为 ousum 原来的值加上 b 的值
done
    echo "偶数和是 $ousum"

image-20210719115419117



方法二:

#!/bin/bash

oushu=0
jishu=0
for i in {1..100}    #变量i 取值,1到100
do
    if  [  $[ i % 2 ] -eq 0 ];then     #
        oushu=$[$oushu + $i]
    else
        jishu=$[$jishu + $i]
    fi
done
echo "偶数和为$oushu"
echo "奇数和为$jishu"



方法三:

#!/bin/bash

jisum=0
ousum=0

for ((i=1;i<=100;i+=2))        # i 取值1, i 小于等于 100 时,条件成立。每次循环,i值加2, 
do
    jisum=$[$jisum + $i]
done

for ((i=2;i<=100;i+=2))     # i 取值2, i 小于等于 100 时,条件成立。每次循环,i值加2,
do
    ousum=$[$ousum + $i]
done

echo "奇数和为:$jisum"
echo "偶数和为:$ousum"

4.执行脚本输入用户名,若该用户存在,输出提示该用户已存在;若该用户不存在,提示用户输入密码,建立用户并设立其密码

#!/bin/bash

#将用户的输入作为变量name 的值
read -p "请输入用户名:" name

#查看用户是否存在。用户存在,返回值为0,用户不存在,返回值为非零值
id $name &>/dev/null      

if [ $? -eq 0 ];then        #返回值为0,则为真
    echo "用户$name已经存在"
else
	
		#$? 返回值为非0,则要用户输入 新用户密码
    read -p "请输入$name用户密码:" Passwd
    
    if [ ! -z  $Passwd ];then   # -z ,数据为空则为真。” ! -z “ 表示取反。 即,如果 变量$Passwd 有值,则为真
        useradd -m -p "$Passwd" $name
        echo "用户$name 创建成功"
    else
        echo "您没有输入用户$name 的密码"
    fi
fi

image-20210719124252008



5.检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中

#!/bin/bash

for n in 192.168.23.{1..25}   #n取值1到25
do
{
    #ping 这些主机
    ping -c 3 -i 0.5 -w  2 $n &> /dev/null   #如果ping 通,则返回值为0,不同>则返回值为非零 


    if [ $? -eq 0 ];then   #如果返回值为0,则为真 
        echo "$n is online" >> /root/host_ip
    else
        echo "$n is offline" >>/root/host_ip
    fi

} &    #将这些命令一起放到后台执行,并行执行,效率更高
done
wait   #等待,后面的命令会等后台命令执行完成之后才会执行
cat /root/host_ip

image-20210719140903182



6.用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash

#设置变量cishu的初始值为0
cishu=0

while [ $cishu -lt 3 ]    #当变量cishu 小于3 的时候,条件成立
do
    #用户第一次输入的数据作为 变量 First_Passwd 的值
    read -p "请输入密码:"  First_Passwd

    #用户第二次输入的数据作为 变量Second_Passwd 的值
    read -p "请再次输入密码:" Second_Passwd

    #判断第一次的输入和第二次的输入是否一样
    if [ "$First_Passwd" == "$Second_Passwd" ];then  #一样为真
        echo "密码正确"
        echo "之前密码输入错误$cishu 次"  
        exit       #密码输入正确,则退出脚本
    else
        echo "密码错误"
        let cishu++   #如果密码输入错误,让变量cishu的值加1
    fi
    
done
echo "警告!!密码输入错误次数过多"

image-20210719185340924



7.编写能够自动生成一个8位随机密码的脚本

#!/bin/bash

#设置变量a 的值为 0-9,及26个大小写字母。 一共62位
a="0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"


#因为要取8位随机密码,所以循环8次
for i in {1..8}
do

    #${#变量名}可以获取到变量的字符串长度,这里,字符a的长度是62,所以就是$RAMDOM 取余 62
    # 变量num的值在 0-61 之间
    num=$[RANDOM% ${#a}]


    #字符串截取,并拼接。${a:num:1} 将字符串"a" 从第 $num 位开始截取,截取1位
    #注:字符串的下标是从0开始
    Pass=${a:num:1}$Pass   #也可以 Pass+=$Pass
done
echo $Pass

image-20210719191151259



8. mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#!/bin/bash

#linux中,分隔符保存在变量IFS 中,默认分隔符是空格,制表符\t,及换行符\n 。
#使用set | grep "IFS" 命令查看

#将变量IFS 的值储存到变量OLDIFS 中
OLDIFS=$IFS

#将变量IFS的值,添加":" 。因为PATH变量的值是用 冒号":"分割
IFS=$IFS':'


for i in $PATH   #for 循环遍历
do

    folder=$(find $i -type d )   #在PATH的目录中,用find 命令找出类型是目录的,赋值给变量 folder 

   for d in $folder  #for 循环遍历输出
    do
        echo $d     
    done


    file=$(find $i -type f )   #从PATH变量的目录中,找出类型是文件 的数据,赋值给变量file
    for f in $file            #for 循环遍历
    do
        if [ ! -x "$f" ];then   # " [ -x "$f" ] ,文件有执行权限为真。"[ !-x "$f " ] 对结果取反。可以理解为,文件没有执>行权限为真
                echo "--- $f"   #输出没有执行权限的文件
        fi
    done
done

#变量IFS 取回原来的值
IFS=$OLDIFS

image-20210719193850938

posted @ 2021-07-19 19:43  知己一语  阅读(1002)  评论(0编辑  收藏  举报