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/bashread -p "请输入一个小于100的整数" p
sum=0 #定义一个变量sum初始值=0if [ $p -gt 0 ] && [ $p -lt 100 ]
# 检查输入是否为整数且小于100
#[ $p -gt 0 ]:判断$p的值是否大于0。如果是,返回真(true);否则返回假(false)。
#[ $p -lt 100 ]:判断$p的值是否小于100。如果是,返回真(true);否则返回假(false)。
#&&:逻辑与运算符,表示两个条件都必须满足时,整个条件判断才为真。thenfor (( i=1;i<=p;i++ ))
#计算从1到该数之间所有整数的和dosum=$(($sum+$i))doneecho "从1到100所有整数的和为 $sum "elseecho "输入有误"
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++ ))
doif (( i % 2 == 0 )); theneven_sum=$((even_sum + i))elseodd_sum=$((odd_sum + i))fi
done# 打印结果
echo "从1到100之间所有偶数的和为: $even_sum"
echo "从1到100之间所有奇数的和为: $odd_sum"
4.用户名存放在oses.文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不。输入密码,建立用户并设立其密码
1 #!/bin/bash2 3 for iname in $(cat /root/oses.txt)4 do5 grep "^$iname" /etc/passwd &> /dev/null6 if [ $? -eq 0 ];then7 echo "已存在"8 userpd=$(grep "^$iname" /etc/shadow | awk -F: '{prin t $2}')9 if [ "$userpd"=="!!" ] || [ "$userpd" == "*" ] || [ -z "$userpd" ];then10 echo "没有密码,请设置密码"11 read -p "输入用户 $iname 密码:"passwd112 read -p "确认密码 $iname 密码:"passwd213 if [ "$passwd1" == "$passwd2" ];then14 echo $passwd1 | passwd --stdin $iname &> /dev/ null15 else16 echo "密码不一致"17 fi18 fi19 else20 echo "$iname用户不存在"21 read -p "输入用户 $iname 密码:"pd122 read -p "确认密码 $iname 密码:"pd223 if [ "$pd1" == "$pd2" ];then24 useradd $iname25 echo $pd1 | passwd --stdin $iname &> /dev/null26 else27 echo "密码不一致"28 fi29 fi30 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。
doread -s -p "请输入密码: " input_password# 检查输入的密码是否正确if [[ $input_password == $correct_password ]]; thenecho "密码正确!"exit 0elseecho "密码错误!还有 $((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+=$passddoneecho "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/nullfind $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=$bb=$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++))
doa=$[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,那么条件成立,执行后续的代码块;否则,跳过该代码块thenecho -n "0"elseecho -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}
doyushu=$[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++))
doa=$[a / 2]result=$[num - a]if [ $result -lt 0 ];thenecho -n 0elseecho -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的原始值