shell-for循环语句练习题

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

[root@localhost ~]# vim 1.sh
#!/bin/bash
sum=0         #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$[ i+sum ]    
#在每次循环中,变量i的值会依次取1到100的整数值。
#sum是一个累加器,初始值为0。
#$[ i+sum ]表示将当前循环次数的整数值i与当前的sum值相加,
#并将结果赋值给sum。
#在每次循环结束后,sum的值都会增加当前循环次数的整数值。

通过这种方式,循环结束后,sum的值就是从1到100的所有整数之和。
done              #for语句结束标志
echo "1-100的整数和为:$sum"  #循环结束后输出内容

[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# ./1.sh

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

[root@localhost ~]# vim 002.sh

#!/bin/bash

read -p "请输入一个小于100的整数" p
sum=0       #定义一个变量sum初始值=0

if [ $p -gt 0 ] && [ $p -lt 100 ]
# 检查输入是否为整数且小于100
#[ $p -gt 0 ]:判断$p的值是否大于0。如果是,返回真(true);否则返回假(false)。
#[ $p -lt 100 ]:判断$p的值是否小于100。如果是,返回真(true);否则返回假(false)。
#&&:逻辑与运算符,表示两个条件都必须满足时,整个条件判断才为真。
  then
    for  (( i=1;i<=p;i++ ))
#计算从1到该数之间所有整数的和
     do
      sum=$(($sum+$i))
     done
     echo "从1到100所有整数的和为 $sum "
   else
    echo "输入有误"
fi

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

#!/bin/bash

# 初始化偶数和与奇数和
even_sum=0 #奇数变量初始值
odd_sum=0  #偶数变量初始值

#用于判断变量i是否为偶数。
#(( i % 2 == 0 )):使用取模运算符%计算i除以2的余数,如果余数等于0,则表示i是偶数。
#if (( i % 2 == 0 )); then:如果i是偶数,则执行后面的代码块。
for (( i=1; i<=100; i++ ))
do
    if (( i % 2 == 0 )); then
        even_sum=$((even_sum + i))
    else
        odd_sum=$((odd_sum + i))
    fi
done

# 打印结果
echo "从1到100之间所有偶数的和为: $even_sum"
echo "从1到100之间所有奇数的和为: $odd_sum"

4.用户名存放在oses.文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不。输入密码,建立用户并设立其密码

  1 #!/bin/bash
  2 
  3 for iname in $(cat /root/oses.txt)
  4 do
  5    grep "^$iname" /etc/passwd &> /dev/null
  6    if [ $? -eq 0 ];then
  7       echo "已存在"
  8       userpd=$(grep "^$iname" /etc/shadow | awk -F: '{prin    t $2}')
  9       if [ "$userpd"=="!!" ] || [ "$userpd" == "*" ] || [     -z "$userpd" ];then
 10          echo "没有密码,请设置密码"
 11          read -p "输入用户 $iname 密码:"passwd1
 12          read -p "确认密码 $iname 密码:"passwd2
 13          if [ "$passwd1" == "$passwd2" ];then
 14             echo $passwd1 | passwd --stdin $iname &> /dev/    null
 15          else
 16             echo "密码不一致"
 17          fi
 18       fi
 19    else
 20       echo "$iname用户不存在"
 21       read -p "输入用户 $iname 密码:"pd1
 22       read -p "确认密码 $iname 密码:"pd2
 23       if [ "$pd1" == "$pd2" ];then
 24          useradd $iname
 25          echo $pd1 | passwd --stdin $iname &> /dev/null
 26       else
 27          echo "密码不一致"
 28       fi
 29    fi
 30 done

###
检查该用户账户是否存在于/etc/passwd文件中。如果存在,则输出"已存在"。
如果用户账户存在,并且其密码为空(即密码字段为"!!"、"*"或为空),则提示用户输入密码并进行确认。如果两次输入的密码一致,则使用passwd命令将密码设置为该用户的密码。否则,输出"密码不一致"。
如果用户账户不存在,则提示用户输入密码并进行确认。如果两次输入的密码一致,则使用useradd命令创建该用户账户,并使用passwd命令将密码设置为该用户的密码。否则,输出"密码不一致"。

 

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

[root@localhost ~]# vim 05.sh

#!/bin/bash
#检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中

for num in {22..245} #定义变量从22-245
do
  {
    hostip="20.0.0.$num"
    ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
# ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null 是一个用于测试网络连接的命令,它的意思是:

# ping:使用 ICMP 协议向目标主机发送数据包,以检查网络连接是否正常。
# -c 4:发送 4 个数据包。
# -i 0.5:每个数据包之间的时间间隔为 0.5 秒。
# -W 2:设置等待响应的超时时间为 2 秒。
# $hostip:目标主机的 IP 地址,这是一个变量,需要替换为实际的 IP 地址。
# &> /dev/null:将命令的输出重定向到 /dev/null,即丢弃输出结果,只显示命令执行成功或失败的状态。
    if [ $? -eq 0 ];then
# 上一个命令的退出状态等于 0(即命令成功执行),则执行 if 语句块中的代码。
      echo "$hostip is online" >> /root/host_ip.txt
# 将包含主机IP地址的字符串 "hostip is online" 追加到名为 host_ip.txt 的文件中。这个文件位于 /root 目录下。
    fi
  }&
done
wait
cat /root/host_ip.txt

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

[root@localhost ~]# vim 06.sh

#!/bin/bash

# 初始化变量

correct_password="123456"   #正确密码
attempts=3                  #输入次数

# 循环提示用户输入密码
for (( i=1; i<=$attempts; i++ ))
# i=1是循环的初始条件,i<=$attempts是循环的继续条件,i++是每次循环后的操作。
# i=1:这是循环变量i的初始值,表示从1开始。
# i<=$attempts:这是循环的继续条件,当i的值小于或等于$attempts时,循环会继续。
# i++:这是每次循环后的操作,表示每次循环后i的值会增加1。
do
    read -s -p "请输入密码: " input_password

    # 检查输入的密码是否正确
    if [[ $input_password == $correct_password ]]; then
        echo "密码正确!"
        exit 0
    else
        echo "密码错误!还有 $((attempts - i)) 次尝试机会。"
    fi
done

# 达到最大尝试次数后报警
echo "连续输错3次密码,已触发报警!"

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

#!/bin/bash
#自动生成一个6位数的随机密码,密码范围可以是小大写字母和数字

STR="0123456789shiABCDEFGHIJKLMNOPQRSTUVWXYZ"
# 定义一个字符串STR,包含0-9的数字,以及小写字母和大写字母


for ((i=1; i<=6; i++))
# 循环6次,每次循环都会从STR中随机选择一个字符,并将其添加到password变量中
do
   #获取字符串所有下标的随机数
   num=$[RANDOM % ${#STR}]
   #根据随机下标获取一个随机字符
   passd=${STR:num:1}
   #将随机字符进行拼接
   password+=$passd

done

echo "6位随机密码为 $password"

8..输出PATH环境变量的目录里所有以se开头的文件

[root@localhost ~]# vim 08.sh

#!/bin/bash
#输出PATH环境变量的目录里所有以se开头的文件

IFS_OLD=$IFS
# 将当前的内部字段分隔符(Internal Field Separator)保存到变量IFS_OLD中,以便后续恢复
IFS=$IFS':'
# 将内部字段分隔符设置为冒号(:),以便在循环中正确处理路径中的多个目录。

for i in $PATH
# 遍历PATH环境变量中的每个目录
do
  #ls $i/se* 2> /dev/null
  find $i -name "se*" -print 2> /dev/null
# 遍历PATH环境变量中的每个目录
done

9. 求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89..,数列从第3项开始每一项等于前两项之和,打印前10个元素

[root@localhost ~]# vim 09.sh

#!/bin/bash

# 初始化前两个元素
a=1
b=1

# 打印前两个元素
echo $a
echo $b

# 计算并打印后续的元素
for ((i=3; i<=10; i++))
# 从3开始,每次增加1,直到10,包括10。在这个循环中,变量i的值会依次为3、4、5、6、7、8、9、10。
do
    # 计算新元素
    c=$((a + b))

    # 打印新元素
    echo $c

    # 更新前两个元素
    a=$b
    b=$c
done


###
首先将变量 a 和 b 初始化为 1,然后通过循环从第 3 个元素开始,
依次计算斐波那契数列的每个元素。
在每次循环中,它使用变量 a 和 b 的值来计算新的元素 c,并将 c 打印出来。
然后,它将变量 a 更新为原来的 b,将变量 b 更新为新计算出的 c。
循环继续进行,直到生成了前 10 个斐波那契数列的元素。

10.使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数

#!/bin/bash
# 使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数
# 减法正排
read -p "请输入一个0-255的整数量" num
a=256
for ((i=1; i<=8; i++))
do
    a=$[a / 2]
# 这行代码将变量 a 除以 2,并将结果赋值给变量 a。换句话说,它将 a 的值更新为原来的一半。
    result=$[num - a]
# result=$[num - a]:这行代码从变量 num 中减去变量 a 的值,并将结果赋值给变量 result。换句话说,它将 num 的值减去 a 的一半,并将结果存储在 result 变量中。
    if [ $result -lt 0 ]
# 用于判断变量 $result 的值是否小于0。如果 $result 的值小于0,那么条件成立,执行后续的代码块;否则,跳过该代码块
    then
        echo -n "0"
    else
        echo -n "1"
        num=$[num - a]
    fi
done
echo


###
这段代码首先提示用户输入一个0到255之间的整数,并将其存储在变量num中。
然后,它初始化变量a为256,并使用循环语句进行8次迭代。
在每次迭代中,它将a除以2,并将结果存储回a中。
接下来,它计算num减去a的结果,并将其存储在变量result中。
如果result小于0,则输出字符"0";
否则,输出字符"1",并将num减去a的结果重新赋值给num。
最后,在循环结束后,输出换行符。
这样,最终得到的输出就是输入的十进制数对应的8位二进制数。


余数倒排

#!/bin/bash

# 提示用户输入一个0-255的整数
read -p "输入一个0-255的整数: " num

# 初始化结果变量为空字符串
# result=""

# 循环8次,每次取num的最低位(余数),并将其添加到结果字符串的前面
for i in {1..8}
do
    yushu=$[num % 2]  # 取num的最低位(余数)
    num=$[num / 2]    # 将num除以2,相当于右移一位
    result=$yushu$result  # 将余数添加到结果字符串的前面
done

# 输出转换后的二进制数
echo $result

####
    
这段代码首先通过read命令获取用户输入的整数,并将其存储在变量num中。
然后,使用一个循环来逐步将该整数转换为二进制形式。
在每次循环中,它计算num的最低位(余数),并将余数添加到结果字符串的前面。
接着,将num除以2,相当于将其右移一位。最后,循环结束后,输出转换后的二进制数。

#减法正排

 #减法正排


#!/bin/bash
#减法正排

read -p "输入一个0-255的整数: " num
#for i in 128 64 32 16 8 4 2 1
a=256
for ((i=1; i<=8; i++))
do
   a=$[a / 2]
   result=$[num - a]
   if [ $result -lt 0 ];then
   echo -n 0
   else
   echo -n 1 
   let num-=$a
fi
done
echo ''
 

###
首先,通过read -p命令提示用户输入一个0-255的整数,并将输入的值赋给变量num。
然后,将变量a初始化为256。
接下来,使用for循环进行8次迭代,每次迭代执行以下操作:
将变量a除以2,更新其值。
计算num减去a的结果,并将结果赋给变量result。
如果result小于0,则输出字符"0";否则,输出字符"1",并更新num的值,将其减去a。
最后,输出一个空行。

11.将一个200行的文件分割成多个50行的文件

#!/bin/bash
#将一个200行的文件分割成多个50行的文件
filepath=/root/test.txt
#定义行数计数器变量
a=0
#定义文件序号变量
i=1
IFS_OLD=$IFS
IFS=$'\n'
for line in $(cat $filepath)
do
let a++
#判断是否已经读入50行,满50行则文件序号+1
c=$[a % 50]
if [ $c -eq 0 ];then
echo $line >> /root/test${i}.txt
let i++
else
echo $line >> /root/test$f{i}.txt
fi
done
IFS=$IFS_OLD


###
这段代码是一个bash脚本,用于将一个200行的文件分割成多个50行的文件。首先定义了一个文件路径变量filepath,然后定义了两个计数器变量a和i,分别用于记录当前读取的行数和生成的文件序号。接着,使用IFS(内部字段分隔符)来设置输入字段分隔符为换行符,以便按行读取文件。在for循环中,逐行读取文件内容,每读取一行,计数器a加1。当a是50的倍数时,说明已经读取了50行,此时将当前行写入新的文件,并将文件序号i加1。否则,将当前行写入当前文件。最后,恢复IFS的原始值

相关推荐

  1. shell--for循环

    2024-05-10 17:20:10       12 阅读
  2. C#-for循环语句

    2024-05-10 17:20:10       8 阅读
  3. C# —— for循环语句

    2024-05-10 17:20:10       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 17:20:10       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 17:20:10       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 17:20:10       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 17:20:10       18 阅读

热门阅读

  1. Spring自动装配:解析原理与实践

    2024-05-10 17:20:10       10 阅读
  2. Python编程技巧(下篇)

    2024-05-10 17:20:10       9 阅读
  3. LInux 基础指令

    2024-05-10 17:20:10       8 阅读
  4. 【使用openpyxl对.xlsx文件增删改查】

    2024-05-10 17:20:10       11 阅读
  5. React 第二十三章 shouldComponentUpdate

    2024-05-10 17:20:10       10 阅读
  6. 深入浅出微前端架构

    2024-05-10 17:20:10       10 阅读
  7. LXC,SRIOV,虚拟化

    2024-05-10 17:20:10       11 阅读
  8. 敏捷开发实践集(AgileDo):如何做好Scrum Master

    2024-05-10 17:20:10       14 阅读