Shell脚本练习题(附详细解题过程)

目录

一、利用for循环打印99乘法表 

二、十进制转二进制 

三、将十进制ip地址转换为二进制格式

四、检测某个网段中存活的主机并输出其ip地址

五、检查文件中用户名是否存在并提示创建用户和设置密码

六、检查httpd服务并开启

七、根据百米赛跑成绩判断结果

八、随机数实现猜数字游戏

九、随机数生成6位随机密码

十、查看$PATH指定目录下的可执行文件 


一、利用for循环打印99乘法表 

[root@localhost2 ~]#vim chengfabiao.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    m=$[ $i * $j ]    #乘积值赋给m
    echo -ne "$i*$j=${m} "    #指定输出样式
  done
  echo -e '\n'    #每行输出完后换行
done


[root@localhost2 ~]#bash chengfabiao.sh
1*1=1

2*1=2 2*2=4

3*1=3 3*2=6 3*3=9

4*1=4 4*2=8 4*3=12 4*4=16

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

二、十进制转二进制 

[root@localhost2 ~]#vim numchange.sh
#依次减数法
#!/bin/bash
read -p "请输入一个0~255的整数:" num
for i in 128 64 32 16 8 4 2 1
do
  NUM=$[num - i]
  if [ $NUM -lt 0 ];then
    echo -n 0
  else
    echo -n 1
    num=$[num - i]
  fi
done
echo ""

#取余倒排法
#!/bin/bash
sum=''
read -p "请输入一个0~255的整数:" num
for i in {1..8}
do
  NUM=$[num % 2]
  sum=$NUM$sum
  let num/=2

done
echo $sum

[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:231
11100111
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:54 
00110110
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:83 
01010011

三、将十进制ip地址转换为二进制格式

[root@localhost2 ~]#vim changeip.sh 
#!/bin/bash
read -p "请输入您的ip地址:" ip
b=0
IFSb=$IFS
IFS=$IFS'.'     #为$IFS添加字段分隔符'.'
for i in `echo $ip`
do
  for a in 128 64 32 16 8 4 2 1    #依次减数法将十进制转二进制
  do
    NUM=$[$i - $a]
    if [ $NUM -lt 0 ];then
      echo -n 0
    else
      echo -n 1
      i=$[$i - $a]
    fi
  done
  let b++
  if [ $b -eq 4 ];then    #第四次循环不输出'.',否则格式不对
    break
  fi
  echo -n '.'
done
echo " "

[root@localhost2 ~]#bash changeip.sh 
请输入您的ip地址:192.156.34.166
11000000.10011100.00100010.10100110 

[root@localhost2 ~]#bash changeip.sh 
请输入您的ip地址:192.168.13.11
11000000.10101000.00001101.00001011 

四、检测某个网段中存活的主机并输出其ip地址

[root@localhost2 ~]#vim checkalivedhosts.sh
#!/bin/bash
for ip in 192.168.116.{1..254}    #指定ip范围
do
  {
   ping -c 3 -i 0.5 -w 2 $ip &> /dev/null    #每0.5秒ping目标主机3个包
   if [ $? -eq 0 ];then    -- 判断上条命令执行结果
     echo "$ip is online"  > /root/alive_hosts.txt    #执行成功将在线的主机名重定向输入文件
   else
     echo "$ip is outline"
   fi
  }&    #将命令程序段放入后台执行(实现多线程,加快执行效率)
done

wait    
echo "存活主机统计:"
cat /root/alive_hosts.txt    #将存活主机ip统计显示出来

[root@localhost2 ~]#bash checkalivedhosts.sh
192.168.116.14 is outline 192.168.116.3 is outline 192.168.116.5 is outline
192.168.116.11 is outline 192.168.116.7 is outline 192.168.116.6 is outline
192.168.116.10 is outline 192.168.116.15 is outline 192.168.116.9 is outline
192.168.116.17 is outline 192.168.116.18 is outline 192.168.116.16 is outline
192.168.116.19 is outline 192.168.116.4 is outline 192.168.116.21 is outline 
...  #输出结果太多,这里省略
192.168.116.242 is outline 192.168.116.241 is outline 192.168.116.243 is outline
192.168.116.244 is outline 192.168.116.245 is outline 192.168.116.247 is outline
192.168.116.246 is outline 192.168.116.248 is outline 192.168.116.249 is outline
192.168.116.251 is outline 192.168.116.252 is outline 192.168.116.250 is outline
192.168.116.254 is outline 192.168.116.253 is outline
存活主机统计:
192.168.116.20 is online

五、检查文件中用户名是否存在并提示创建用户和设置密码

#创建 users.txt 用户列表文件
[root@localhost1 ~]#cd /data
[root@localhost1 data]#vim users.txt
#需要创建的用户列表
zhangsan
lisi
wangwu
zhaoliu
qianqi
zhuba

#编写 checkuser.sh 脚本
[root@localhost1 data]#vim checkuser.sh
#!/bin/bash
#用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,则建立用户并提示用户设置密码

for user in `cat /data/users.txt`     #指定循环范围(用户列表文件users.txt)
do
  grep "^$user" /etc/passwd &> /dev/null  #判断用户是否存在
  if [ $? -eq 0 ];then     #用户存在
    echo "用户${user}已存在!"

    #检查存在的用户密码是否为空
    checkpd=`cat /etc/shadow | grep "^${user}" | awk -F: '{print $2}'`
    if [ $checkpd = "!!" ] || [ -z ${checkpd} ];then  #存在用户密码为空
    while true  #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd1
      read -p "再次输入确认密码:" passwd2
      if [ ${passwd1} = ${passwd2} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd1} | passwd --stdin $user
        break
      fi
    done
    fi
  else  #用户不存在
    useradd ${user}  #创建用户
    echo "用户${user}不存在,已为您创建${user}!"
    while true    #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd3
      read -p "再次输入确认密码:" passwd4
      if [ ${passwd3} = ${passwd4} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd3} | passwd --stdin $user
        break
      fi
    done
  fi
done

#测试 checkuser.sh
[root@localhost1 data]#bash checkuser.sh
#zhangsan存在且有密码
用户zhangsan已存在!

#lisi存在但无密码,需要设置
用户lisi已存在!
用户lisi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#wangwu存在但无密码,需要设置
用户wangwu已存在!
用户wangwu尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#zhaoliu存在且有密码
用户zhaoliu已存在!

#qianqi不存在且无密码,需要设置
用户qianqi不存在,已为您创建qianqi!
用户qianqi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 qianqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#zhuba不存在且无密码,需要设置
用户zhuba不存在,已为您创建zhuba!
用户zhuba尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 zhuba 的密码 。
passwd:所有的身份验证令牌已经成功更新。

六、检查httpd服务并开启

[root@localhost1 ~]#vim checkhttpd.sh 
#!/bin/bash
systemctl is-active httpd &> /dev/null    #判断httpd服务是否开启
if [ $? -eq 0 ];then
  echo 'httpd is active!'    #如果开启输出已开启
else    #如果未开启进行如下操作
  rpm -q httpd &> /dev/null    #检查httpd是否下载
  if [ $? -ne 0 ];then    #如果未下载,进行以下操作
    yum -y install httpd &> /dev/null    #联网且有在线源可直接下载,如果不行,进行以下操作
    df -hT | grep /dev/sr0 &> /dev/null    #检查光盘是否挂载
    if [ $? -ne 0 ];then
      mount /dev/sr0 /mnt &>/dev/null    #未挂载则挂载
    fi
    yum -y install httpd &> /dev/null    #本地镜像源下载(需要有本地yum源配置文件)
  fi
  systemctl start httpd &> /dev/null    #启动httpd服务
  echo 'httpd is starting...'
  if systemctl is-active httpd &> /dev/null    #再次判断httpd服务是否开启
  then
    echo 'httpd was stated succesfully!'    #如果开启输出启动成功
  else
    echo 'fail to start httpd!'    #如果关闭输出启动失败
  fi
fi

[root@localhost1 ~]#bash checkhttpd.sh 
httpd is starting...
httpd was stated succesfully!

七、根据百米赛跑成绩判断结果

[root@localhost1 ~]#vim judgerace.sh
#!/bin/bash
#提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;
#进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误

read -p "请输入您的100米赛跑成绩(s):" time
if [ $time -gt 0 -a $time -le 10 ] ;then
  echo "恭喜您,进入选拔赛!"
  read -p "请输入您的性别(男/女):" sex
    case $sex in
    男)
      echo "请您进入男生组!"
      ;;
    女)
      echo "请你进入女生组!"
      ;;
    *)
      echo "输入有误,请重新输入!"
      ;;
    esac
elif [ $time -gt 10 ];then
  echo "很遗憾,您没有进入选拔赛!"
else
  echo "输入有误,请重新输入!"
fi

[root@localhost1 ~]#bash judgerace.sh
请输入您的100米赛跑成绩(s):8
恭喜您,进入选拔赛!
请输入您的性别(男/女):男
请您进入男生组!

八、随机数实现猜数字游戏

[root@localhost1 data]#bash guessprice.sh
#!/bin/bash
#获取0~999的随机数
num=$[RANDOM % 1000]
i=1 #定义i为循环条件
a=0 #定义a为猜测次数变量
while [ $i -eq 1 ]
do
read -p "请输入你猜测的价格(0~999):" price
  if [ $price -eq $num ];then
    echo "恭喜你猜对了!"
    let a++
    let i+=1
  elif [ $price -gt $num ];then
    echo "你猜高了,请继续!"
    let a++
  elif [ $price -lt $num ];then
    echo "你猜低了,请继续!"
    let a++
  fi
done
echo "你一共猜了${a}次。"

[root@localhost1 data]#bash guessprice.sh
请输入你猜测的价格(0~999):600
你猜高了,请继续!
请输入你猜测的价格(0~999):400
你猜高了,请继续!
请输入你猜测的价格(0~999):200
你猜高了,请继续!
请输入你猜测的价格(0~999):100
你猜低了,请继续!
请输入你猜测的价格(0~999):150
你猜高了,请继续!
请输入你猜测的价格(0~999):120
你猜低了,请继续!
请输入你猜测的价格(0~999):134
你猜低了,请继续!
请输入你猜测的价格(0~999):140
你猜高了,请继续!
请输入你猜测的价格(0~999):135
你猜低了,请继续!
请输入你猜测的价格(0~999):137
你猜高了,请继续!
请输入你猜测的价格(0~999):136
恭喜你猜对了!
你一共猜了11次。

九、随机数生成6位随机密码

[root@localhost1 data]#vim randompasswd.sh
#!/bin/bash
#指定随机字符的范围
STR="ABCDRFGHIJKLMNOPQRSTUVWXTZabcdrfghijklmnopqrstuvwxtz0123456789"
sum=''
for ((i=1; i<=6; i++))    #指定循环6次(实现输出6位字符)
do
   length=${#STR}    #获取字符范围的长度
   num=$[RANDOM % length]    #在指定长度中生成随机数(作为取字符的索引)
   value=${STR:num:1}    #截取指定索引字符
   sum+=$value    #字符追加到sum变量中
done
echo $sum    #输出$sum(即6位随机密码)

[root@localhost1 data]#bash randompasswd.sh
3qCkpA
[root@localhost1 data]#bash randompasswd.sh
CtdDOG
[root@localhost1 data]#bash randompasswd.sh
nTuF0G

十、查看$PATH指定目录下的可执行文件 

[root@localhost2 ~]#vim findxfile.sh 
#!/bin/bash
IFSb=$IFS
IFS=$IFS':'    #为$IFS添加字符分隔符'.'
for i in `echo $PATH`
do
  echo ---------${i}----------    #每个文件用此条分割
  find $i -type f -a -executable    #查找可执行文件
done

[root@localhost2 ~]#bash findxfile.sh 
---------/usr/local/bin----------
---------/usr/local/sbin----------
---------/usr/bin----------
/usr/bin/cpio
/usr/bin/less
/usr/bin/catchsegv
/usr/bin/gencat
/usr/bin/getent
/usr/bin/plistutil
...    #文件太多这里省略
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值