Shell脚本案例---3

1)通过非交互式和交互式选择安装操作系统。
下面是非交互式(命令行执行脚本时直接输入变量)选择centos系统。
执行脚本时,后面跟的第一个变量就赋值给$1,选择centos或redhat,然后就会输出对应的内容,否则会有提示。

[root@db01 scripts]# cat test.sh 
#!/bin/bash

case $1 in
    centos)
    echo "centos"
    ;;
    redhat)
    echo "redhat"
    ;;
    *)
    echo "you should select [redhat|centos]";;
esac
[root@db01 scripts]# sh test.sh centos
centos

下面是交互式选择windows系统的脚本。当输入的内容不是windows或linux时,就会不断循环,直到二选一为止。

[root@db01 scripts]# cat test.sh 
#!/bin/bash

read -p "请输入你要选择的系统:" version

while true
do
case $version in
    windows)
    echo "win10 is ok"
    break
    ;;
    linux)
    echo "centos is ok"
    break
    ;;
    *)
    echo "you should select [win10|centos]"
    read -p "请输入你要选择的系统:" version
esac
done
[root@db01 scripts]# sh test.sh 
请输入你要选择的系统:windows
win10 is ok

2)通过交互式方式查看系统状态。
在执行脚本后,输入h后,会调用函数menu(),在屏幕输出相关的提示帮助,即输入什么字母会显示对应的系统状态。此外,该脚本也是一个循环,除非输入q退出脚本循环(如本脚本中所规定的),或输出给定选项外的其他内容。

[root@db01 scripts]# cat test.sh 
#!/bin/bash
menu(){
cat <<EOF
=========
# h-显示命令帮助
# f-显示磁盘分区
# d-显示磁盘挂载
# m-查看内存使用
# u-查看系统负载
# q-退出程序
=========
EOF
}
while true
do
  read -p "请输入你想查看的系统状态:" sys
  case $sys in
      h)
        menu
        ;;
      f)
        lsblk
        ;;
      d)
        df -h
        ;;
      m)
        free -m
        ;;
      u)
        uptime
        ;;
      q)
        exit
        ;;  
      *)
        echo "error"
        exit 1;
esac
done

3)通过其他用户文件来创建用户
测试环境(其他的用户文件)准备:

[root@db01 scripts]# echo -e "Alex\nBob\nCindy\nDavid\nEric" >user.txt
[root@db01 scripts]# cat user.txt 
Alex
Bob
Cindy
David
Eric

下面是批量创建用户的脚本

[root@db01 scripts]# cat test.sh 
#!/bin/bash

#与最后一行内容共同构成按行读取文件的命令
while read user

#判断user.txt文件中的用户是否存在
do
    id $user &>/dev/null
    if [ $? -eq 0 ];then
        echo "$user is already exist"
    else
        useradd $user &>/dev/null && \
        echo "$user is created ok"
    fi

#读取该目录下的user.txt文件
done<user.txt
[root@db01 scripts]# sh test.sh 
Alex is created ok
Bob is created ok
Cindy is created ok
David is created ok
Eric is created ok

测试成功,可以通过其他文件来批量创建用户,也可以通过该文件批量删除用户,唯一的区别是,将useradd换成userdel
下面是读取其他文件的用户来批量删除用户。

[root@db01 scripts]# cat test.sh 
#!/bin/bash

while read user
do
    id $user &>/dev/null
    if [ $? -eq 1 ];then
        echo "$user is not exist"
    else
        userdel $user &>/dev/null && \
        echo "$user is deleted"
    fi
done<user.txt

补充说明:
做死循环用while,按照行读
固定循环用for,按照空格读

4)计算Linux系统所有进程占用内存之和
提示:ps aux找到RSS对应的内存之和

[root@db01 scripts]# cat test.sh 
#!/bin/bash

#找到RSS对应列的所有数值,并排除掉‘RSS’这一标题行
num=$(ps -aux|awk '{print $6}'|grep -v 'RSS')

#定义初识内存和变量
sum=0

#用for循环,将所有遍历的值相加,赋值给sum
for i in $num
do
    sum=$[($i+$sum)]
done

#最终输出结果
echo $sum

5)猜随机数,以买西红柿讨价还价为例。
要求:在执行脚本后,最上方会显示本次的“西红柿价格”,但我们可以当作看不见,以交互式方式不断输入猜测的西红柿价格,期间可以无数次循环执行,知道猜对价格方可退出循环。

脚本内容如下:

[root@db01 scripts]# cat price.sh 
#!/bin/bash

#定义初识的猜测次数变量,赋值给total
total=0

#定义随机数生成的西红柿价格变量,取值范围0~60
num=$((RANDOM%61))

#交互式过程中系统给出的提示内容
echo -e "当前西红柿价格$num元/斤\n========================\n==========================\n现在西红柿怎么卖\n来猜一猜"

#构造函数,判断输入的内容是否是整数,否则会进入该函数的死循环,直到用户输入的是整数
ifint(){
  read -p "请输入你要猜的数字:" input
  expr $input + 1 &>/dev/null
  if [ $? -ne 0 ];then
    echo "别玩了,快输入数字吧"
    ifint
  fi
}

#构造函数,每调用一次函数,表示猜测西红柿价格的动作都会增加一次
#如果直接猜对,还要在该循环内部进一步判断,猜测西红柿几个一共用了几次。
#将猜测的次数划分不同的程度,从而输出不同的内容。
guess(){
  ((total++))
  if [ $input -eq $num ];then
    echo "猜对了,就是$input元"
    if [ $total -le 3 ];then
      echo "厉害,只用了$total次"
    elif [ $total -gt 3 -a $total -lt 7 ];then
      echo "还不错,用了$total次"
    else
      echo "要继续加油啊,你用了$total次"
    fi
    exit 1
  
  #如果猜错,要告诉用户大概方向,是大了,还是小了。
  elif [ $input -gt $num ];then
    echo "你猜的数字太大了"
   
    #并再次调用自身,进入函数死循环。
    ifint
    
  else
    echo "你猜的数字太小了"
    ifint
  fi
}

#构建主函数,内含初识判断函数和猜测函数。
main(){
  ifint
while true
do
  guess
done
}

#调用主函数
main

6)输出“九九乘法表”

1x1=1   
2x1=2  2x2=4   
3x1=3  3x2=6  3x3=9   
4x1=4  4x2=8  4x3=12 4x4=16  
5x1=5  5x2=10 5x3=15 5x4=20 5x5=25  
6x1=6  6x2=12 6x3=18 6x4=24 6x5=30 6x6=36  
7x1=7  7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49  
8x1=8  8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64  
9x1=9  9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81  

脚本如下:

[root@db01 scripts]# cat test.sh 
#!/bin/bash

#设置输出结果的颜色和光亮显示
color='\E[47;30m'
res='\E[0m'

#第一个数字取值范围1~9
for num1 in `seq 9`
do
  #第二个数字取值范围1~9
  for num2 in `seq 9`
  do
    #表示第一个数字大于等于第二个数字前,都不换行
    #例如11、22、33、44....以此类推
    if [ $num1 -ge $num2 ];then
      
      #两数之积为两位数时,势必会多占一位,上下不对齐。
      if (((num1*num2)>9));then
        
       #表示结果是2位数,因此后面只需一个空格,来与上方(必定比上方数字之积结果大)保持对齐
        echo -en "${color}${num1}x${num2}=$((num1*num2))$res "
      else
        
        #表示结果是1位数,一次后面需要2个空格,来与下方(必定比下方数字之积结果小)保持对齐
        echo -en "${color}${num1}x${num2}=$((num1*num2))$res  "
      fi
    fi
  done
echo " "
done

补充说明:
注意查看倒数第六行的输出内容后面有2个空格
与之相对应的上方条件输出内容后面有1个空格
echo -n表示不换行
echo -e表示识别转义字符

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值