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"
方法二:
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
方法二:
#!/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"
方法二:
#!/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
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
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 "警告!!密码输入错误次数过多"
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
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