shell-for循环语句练习题

news2024/11/25 20:39:38

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的原始值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1660174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024数维杯C题24页完整解题思路+1-4问代码解题+运行高清结果图

C题天然水合物资源量评价 点击链接加入群聊【2024数维杯数学建模ABC题资料汇总】&#xff1a; 2024数维杯C题完整思路24页配套代码1-4问后续参考论文https://www.jdmm.cc/file/2710638 下面内容是持续更新的 根据勘探数据确定天然气水合物资源的分布范围。 假设勘探区域内的…

Python深度学习基于Tensorflow(4)Tensorflow 数据处理和数据可视化

文章目录 构建Tensorflow.data数据集TFRecord数据底层生成TFRecord文件数据读取TFRecord文件数据图像增强 数据可视化 构建Tensorflow.data数据集 tf.data.Dataset表示一串元素&#xff08;element&#xff09;&#xff0c;其中每个元素包含一个或多个Tensor对象。例如&#xf…

【SVN-TortoiseSVN】SVN 的简介与TortoiseSVN 安装使用教程

目录 &#x1f31e;前言 &#x1f30a;1. SVN 的简介 &#x1f30d;1.1 SVN是什么 &#x1f30d;1.2 SVN 工作原理 &#x1f30d;1.3 TortoiseSVN 术语及定义 &#x1f30a;2. TortoiseSVN 安装与汉化 &#x1f30a;3. SVN 基本操作-TortoiseSVN &#x1f30d;3.1 浏览…

35个矩阵账号,如何通过小魔推打造2704万+视频曝光?

在如今的短视频时代&#xff0c;矩阵发布的作用被发挥到极致&#xff0c;通过各个短视频平台的流量分发&#xff0c;虽然视频质量不如那些头部的IP&#xff0c;但是在视频数量上却能做到轻松碾压&#xff0c;让自己的品牌与门店有更多的声量&#xff0c;这就是如今短视频平台对…

sbt安装

一、sbt介绍 在Spark中&#xff0c;sbt&#xff08;Scala Build Tool&#xff09;是一个用于构建Scala项目的工具。它是Spark项目的主要构建工具之一&#xff0c;用于编译Scala代码、管理依赖项、打包应用程序以及执行其他与项目构建相关的任务。 sbt的用途在Spark开发中主要…

云管平台-助力企业云管理飞跃发展!

随著信息技术的快速发展&#xff0c;以及企业数字化的快速改革&#xff0c;云计算已经成为企业信息化建设的重要基石。随着企业云计算的快速应用&#xff0c;以及业务的快速发展&#xff0c;如何快速管理各种云&#xff0c;降低云成本等迫在眉睫。在这个背景下&#xff0c;云管…

使用flutter开发一个U盘文件管理APP,只解析图片文件

今天教大家用flutter撸一个U盘文件管理APP,需求是这样的: 当我在Android设备上插入U盘后,我能在APP中打开U盘的文件目录,并且能进入对应目录的下一级目录,如果下级目录下有图片文件,我就对这个图片文件进行解析,并展示出来。 需求了解后,先上个效果图: 效果图看完后,…

springboot如何查看版本号之间的相互依赖

第一种&#xff1a; 查看本地项目maven的依赖&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的下一层&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的再下一层&#xff1a; 就可以查看springboot的一些依赖版本号了&#xff1b; 第二种&#xff1a; 还…

# 从浅入深 学习 SpringCloud 微服务架构(十五)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十五&#xff09; 一、SpringCloudStream 的概述 在实际的企业开发中&#xff0c;消息中间件是至关重要的组件之一。消息中间件主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&…

经开区创维汽车车辆交接仪式顺利举行,守护绿色出行助力低碳发展

5月10日&#xff0c;“创维新能源汽车进机关”交车仪式于徐州顺利举行&#xff0c;20辆创维EV6 II正式交付经开区政府投入使用。经开区陈琳副书记、党政办公室副主任张驰主任、经开区公车管理平台苑忠民科长、创维汽车总裁、联合创始人吴龙八先生、创维汽车营销公司总经理饶总先…

【计算机毕业设计】基于SSM++jsp的蜀都天香酒楼网站【源码+lw+部署文档+讲解】

目录 摘要 Abstract 目 录 1绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4论文结构 2相关技术介绍 2.1 B/S模式 2.2 MyEclipse开发环境 2.3 MySQL数据库 2.4 Java语言 2.5 JSP技术 2.6 Tomcat服务器 3系统分析 3.1需求分析 3.2可行性分析 3.2.1经济可行性 3.2.2技…

【MySQL探索之旅】JDBC (Java连接MySQL数据库)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

机器学习算法 - 逻辑回归

逻辑回归是一种广泛应用于统计学和机器学习领域的回归分析方法&#xff0c;主要用于处理二分类问题。它的目的是找到一个最佳拟合模型来预测一个事件的发生概率。以下是逻辑回归的一些核心要点&#xff1a; 基本概念 输出&#xff1a;逻辑回归模型的输出是一个介于0和1之间的…

容器化Jenkins远程发布java应用(方式二:自定义镜像仓库远程拉取构建)

1.创建maven项目 2.配置git、maven 3.阿里控制台>容器镜像服务>镜像仓库>创建镜像仓库 4.执行shell脚本&#xff08;推送镜像到阿里云镜像仓库&#xff09; 使用到登录阿里云仓库命令 #!/bin/bash # 服务名称 SERVER_NAMEplanetflix-app # 镜像tag IMAGE_TAG1.0.0-SN…

每日两题 / 24. 两两交换链表中的节点 25. K 个一组翻转链表(LeetCode热题100)

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 定义三个指针&#xff0c;交换前先保存ntnt指针为next->next&#xff0c;cur和next两个节点&#xff0c;然后将pre->next指向next 若pre为空&#xff0c;说明当前交换的节点为头两个节点&#xff0c;…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

金石传拓非遗研学基地 入驻蔚蓝书店

好消息&#xff01;&#xff01;&#xff01; 金石传拓非遗研学基地&#xff0c;正式入驻蔚蓝书店啦&#xff01;&#xff01;&#xff01; “缣竹易销&#xff0c;金石难灭&#xff0c;托以高山&#xff0c;永留不绝。”“金”指的是三代青铜器上的铭文。 “石”指的是石刻、…

PCIE协议-2-事务层规范---事务描述符

2.2.6.1 概览 事务描述符是请求者和完成器之间传输事务信息的机制。事务描述符由三个字段组成&#xff1a; 事务ID&#xff1a;标识未完成的事务属性字段&#xff1a;定义事务的特征流量类别&#xff08;TC&#xff09;字段&#xff1a;将事务与所需的服务类型关联起来 图2-…

PG的事务ID回卷逻辑

PG到目前为止使用的事务ID仍然是32位的&#xff0c;在内存计算时虽然已经使用64位事务ID&#xff0c;但是存储在页中tuple仍然使用32位事务ID&#xff0c;这就是说&#xff0c;事务ID回卷仍然是必须处理的问题。 所谓PG事务ID回卷&#xff0c;简单地说&#xff0c;就是在数据库…

LIN协议栈代码解读,纯干货

LIN协议栈概述 当前用的比较多的LIN协议栈&#xff0c;如果不是VECTOR平台的&#xff0c;那就是NXP的LIN协议栈。NXP的协议栈又分为两套&#xff0c;一套是独立工具生成配置文件&#xff0c;即STACK_Package_4.5.9&#xff0c;通过NCFGui生成配置文件&#xff0c;主要用在MC9S…