Shell练习(31-35)-2019.1.10

31.获取网卡IP并显示颜色

需求:用户输入网卡的名字,然后我们用脚本输出网卡的ip,需要考虑下面的问题

  • 输入的字符不符合网卡名字规范,怎么应对
  • 名字符和规范,但是根本就没有这个网卡又怎么应付

核心要点:

  • ip add show dev eth0
################个人实验################
[root@Chauncey ~]# cat 31z.sh
#!/bin/bash
read -p "Please input the netcard:" n
m=`ip add show dev $n | grep 'inet'|awk '{print $2}'`
if [ "$n" == "eth0" ] || [ "$n" == "lo" ]
    then
       echo "$n:$m"
    else
       echo -e "\033[42;30;5m 网卡不存在。 \033[0m" 
fi
[root@Chauncey ~]# 
###############标准写法###################
[root@Chauncey ~]# cat 31.sh 
#!/bin/bash
ip add | awk -F ':' '$1 - "^[1-9]" {print $2}' > /tmp/eth.list
while :
do
      eths=`cat /tmp/eth.list |xargs`
      read -p "Please input a if name(The eths is `echo -e "\033[31m $eths \033[0m"`):" eth
      if [ -z "$eth" ]
      then 
         echo "Please input a if name."
         continue
      fi
      if ! grep -qw "$eth" /tmp/eth.list
      then
         echo "The if name is error."
         continue
      else
         break
      fi
done

if_ip()
{
      ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' > /tmp/$1.txt
      n=`wc -l /tmp/$1.txt|awk '{print $1}'`
      if [ $n -eq 0 ]
      then
         echo "There is no ip address on the eth."
      else
         echo "The ip address is:"
         for ip in `cat /tmp/$1.txt`
         do
            echo -e "\033[33m $ip \033[0m"
         done
      fi
}


if_ip $eth
[root@Chauncey ~]# 

32.列出目录内容

需求:写一个脚本,实现如下功能:

  • 脚本可以带参数也可以不带参数
  • 参数可以有多个,每个参数必须是一个目录
  • 脚本检查参数个数,若等于0,则列出当前目录本身,否则显示每个参数包含的子目录

核心要点:

  • $#参数个数
  • test -d filename
  • find $d -type d
[root@Chauncey ~]# cat 32.sh
#!/bin/bash
if [ $# -eq 0 ]
then
   echo "当前下的目录文件是"
   ls -l
else
   for d in $@    ###指执行脚本时脚本后边的一堆参数
   do
     if [ -d $d ]
     then
         echo "There are these directory $d"
         find $d -type d
     else  
         echo "并没有该目录:$d"
     fi
    done
fi
[root@Chauncey ~]# 

33.下载文件

需求:定义一个shell函数,能接受两个参数,满足以下要求:

  • 第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置
  • 如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本
  • 如果给的目录存在,则下载文件,下载命令执行结束后,测试问下在成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本

核心要点:

  • $#参数个数 是否为2
  • $2是否为目录
[root@Chauncey ~]# cat 33.sh 
#!/bin/bash
if [ $# -ne 2 ]       ##########判断参数个数不等于2
then
   echo "你必须输入两个参数。第一个参数是网址,第二个参数是目录"
     exit 1
fi

if [ ! -d $2 ]
then
   while :
   do
   read -p "你输入的第二个参数不是一个存在的目录,是否要创建该目录?(y|n):" c
   case $c in
     y|Y)
         mkdir -p $2
         ;;
     n|N)
         exit 51
         ;;
       *)
         echo "请输入y或者n."
         continue
         ;;
    esac
    done
else
      cd $2
      wget $1 
      if [ $? == 0 ]
      then
         exit 0
      else
         echo "下载失败"
         exit 52
      fi
fi
[root@Chauncey ~]# 

34.猜数字

需求:

  • 写一个猜数字的脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小

核心要点:

  • $RANDOM可以生成一个随机数字
  • 随机数字处以101取余则得到0-100的随机数字
[root@Chauncey ~]# cat 34.sh
#!/bin/bash
n=$[ $RANDOM%101 ]
while :
do
   read -p "请输入一个数字:" n1
   if [ -z "$n1" ]
   then
      echo "必须输入一个数字"
      continue
   fi
   n2=`echo $n1 |sed 's/[0-9]//g'`
   if [ -n "$n2" ]
   then
      echo "你输入的数字并不是正整数。"
      continue
   else
      if [ $n -gt $n1 ]
      then
         echo "你输入的数字太小了,请重试。"
      elif [ $n -lt $n1 ]
         then
         echo "你输入的数字大了,请重试。"
         continue
      else
         echo "恭喜你,猜对了!"
         break
      fi
   fi
done

34.猜数字

需求:

  • 执行脚本后,提示输入名字(英文的,可以是大小写字母,数字不能有其他符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
  • 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
  • 前面已经输出过的数字,下次不能再出现
  • 当输入q或者Q时,脚本会退出

核心要点:

  • 判断名字合法性[a-zA-Z0-9]
  • $RANDOM除以100区域得到的0-99之间的随机数
[root@Chauncey ~]# cat 35.sh
#!/bin.bash
f=/tmp/user_number.txt
j_n()
{
     while :
     do
         n=$[$RANDOM%100]
         if awk '{print $2}' $f|grep -qw $n
         then
             continue
         else
             break
         fi
     done
}

while :
do
     read -p "Please input a username:" u
     if [ -z "$u" ]
     then
         echo "请输入用户名。"
         continue
     fi
     
     if [ $u == "q" ] || [ $u == "Q" ]
     then
         exit
     fi
     u1=`echo $u|sed 's/[a-zA-Z0-9]//g'`
     if  [ -n "$u1" ]
     then
         echo "你输入的用户名不规范,正确的用户名应该是大小写字符和数字的组合"
         continue
     else
         if [ -f $f ]
         then
             u_n=`awk -v uu=$u '$1==uu {print $2}'`
             if [ -n "$u_n" ]
             then 
                  echo "用户$u对应的数字是:$u_n"
             else
                  j_n
                  echo "用户$u对应的数字是:$u_n"
                  echo "$u $n" >> $f
             fi
         else
              j_n
              echo "用户$u对应的数字是:$n"
              echo $u $n >> $f
         fi
      fi
done

猜你喜欢

转载自blog.csdn.net/Chauncey_Qin/article/details/86213198