博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day18:获取网卡IP地址|检查目录|下载文件|猜数字|根据名字得数字
阅读量:6517 次
发布时间:2019-06-24

本文共 7781 字,大约阅读时间需要 25 分钟。

hot3.png

1、当用户输入网卡名称时,输出IP地址信息:需要考虑如下两个问题:

当用户输入的网卡名不存在,则怎么应对;

网卡名称符合规范,但是根本没有这个网卡怎么办;

难点1:那么如何获取到 网卡的名称, 可以使用查询命令 ip addr;在使用awk冒号分隔符,以 $1 匹配数字开头的内容,并打印出 $2;

ip  addr|awk -F  ':  '   '$1~"^[0-9]"  {print $2}'

[root@fenye2019 shell]# ip addr|awk -F ': ' '$1~"^[0-9]" {print $2}'loeth0

2、那么如何获取到网卡的IP 呢;   ip addr|grep -w 'eth0'|grep 'inet'|awk '{print $2}'|awk -F '/' '{print $1}'

[root@fenye2019 shell]# ip addr|grep -w 'eth0'|grep ' inet'|awk '{print $2}'|awk -F '/' '{print $1}'172.17.226.62

思路:先把网卡列表查找出来并写入到一个临时文件里 /tmp/eth.list,然后使用while 循环用来用户的输入变量,如下选项:

[root@fenye2019 shell]# echo "please input a name(The is `cat /tmp/eth.list|xargs`): "

please input a name(The is lo eth0): 
然后需要判断是用 if -z 判断这变量是否为空,如果为空,则continue,继续循环崇while出执行重新输入内容,如果不为空,则在使用if 判断输入的变量是否等于 /tmp/eth.list,如果不存在,则提示用户输入错误;再次从while处开始循环,如果输入正确,则使用break,结束本次while循环;继续执行下面的函数;

再次定义一个if_ip( )来过滤IP地址,过滤出来IP地址并写入临时文件 $1.txt($1则表示给函数传递的第一个参数,即$ethx),然后用 wc 判断它的行数是否等于,如果为 0 则表示没有IP地址,给用户提示,如果不为 0 ,则打印出这个IP地址信息;

最后使用函数来列出即可: if_ip  $eth

[root@fenye2019 shell]# cat 31.sh #!/bin/baship addr|awk -F ':' '$1~"^[0-9]" {print $2}' > /tmp/eth.listwhile :do    read -p "please input a if name(The ehts is `cat /tmp/eth.list|xargs`): " eth     if [ -z "eth" ]    then        echo "please input a name "        continue    fi    if ! grep -wq "$eth" /tmp/eth.list    then        echo "The is name is error "        continue    else         break    fidoneif_ip(){    ip addr 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 is address is: "        cat /tmp/$1.txt    fi}if_ip $eth

当然,为了更加直观,也可以给输出的IP地址加上颜色

可以写成一个变量的形式:

eth=`cat /tmp/eth.list` read -p "please input a if name(The ehts is `echo -e "\033[31m$eths\033[0m"`): " eth#修改脚本如上两行,可以修改在read -p 输入时显示红色的:在最下面的函数里,当输出的IP地址文本不为空时,则列出可以使用一下for循环,这样会显示IP地址的黄色颜色即可; for ip in `cat /tmp/$1.txt`	do	    echo -e "\033[33m$ip\033[0m"	done

2、写一个脚本可以带参数也可以不带,参数可以是一个也可以多个,每个参数必须是目录,检测参数个数,如果等于 0 ,则列出当前目录本身,否则显示每个参数的子目录;

注释:判断参数的个数:可以用到  $#  == 0         等同于     $#   -eq  0

检查是否是目录,可以使用 -d 选项;

列出某个目录下子目录:   find   /   type  d 

[root@fenye2019 shell]# cat 32.sh #!/bin/bashif [ $# -eq 0 ]then    ls .else    for d in $@    do        if [ -d $d ]        then            echo "The directory $d "            find $d -type d        else            echo "not is directory"        fi    donefi[root@fenye2019 shell]# sh 32.sh 1.sh  31.sh  32.sh[root@fenye2019 shell]# sh 32.sh  /etc/ /usr/local/

注释:可以用 $# 来判断参数输入的参数个数,当等于 0 时表示后面没有跟参数,使用ls . 列出当前目录本身;

当后面跟了参数:使用for d in  $@ 来循环后面跟的参数,然后使用 if [ -d  $d ] ,判断是否是目录,如果是则列出 find $d -type  d;

$@ 则表示后面的参数内容,         $#  表示参数个数                $0  表示脚本本身             $1 表示第一个参数  $2 表示第二个参数 以此类推

3、给一个shell脚本,定义两个函数,其中第一个为URL下载连接,第二个为下载目录,即是保存的位置;

如果用户给目录不存在,则提示是否创建,如果创建成功则继续执行,否则,返回一个51的错误给给用户;

如果用户下文件,测试文件下载成功与否,成功则返回 0 ∠本,否则返回52错误给用户;

分析:首先要判断一下输入的参数个数是否是2:        if [ $#   -ne   2 ]   then    echo "请输入两个参数"

根据题目要求,判断第二参数是否是目录且存在,不存在由用户选择是否创建: if [ !  -d   $2 ]  then   while : do   read .....  $c  case  $c in  y|y  ;;  n|N 这样;

如果用户选择不创建,则返回错误值 51,不过在 函数里面,定义错误值,只能用户 return 51    如果用 exit  51 则会直接退出这个脚本;

判断是否下载成功,用 echo  $?  来判断:

脚本内容如下:

[root@fenye2019 shell]# cat 33.sh #!/bin/bashif [ $# -ne 2 ]then    echo "请输入两个参数,第一个参数为下载地址,第二个参数为目录"    exit 1fiif [ ! -d $2 ]then    while :    do         read -p "第二个目录不存在,是否创建该目录: " c    case $c in    y|Y)        mkdir -pv $2        break        ;;    n|N)        exit  51        ;;    *)        echo "你只能输入Y或者N "        continue        ;;    esac    donefi    cd $2    wget $1    if [ $? -eq 0 ]    then        exit 0    else        exit 51    fi执行这个脚本:参数是不存在的下载连接和目录:[root@fenye2019 shell]# sh 33.sh 1 /tmp/1第二个目录不存在,是否创建该目录: ymkdir: created directory ‘/tmp/1’--2019-02-21 15:28:53--  http://1/Resolving 1 (1)... 0.0.0.1Connecting to 1 (1)|0.0.0.1|:80... failed: Invalid argument.[root@fenye2019 shell]# echo $?51执行这个脚本:参数为正确的下载连接和目录:[root@fenye2019 shell]# sh 33.sh https://my.oschina.net/yuanhaohao/blog/2994879 /tmp/fenye第二个目录不存在,是否创建该目录: ymkdir: created directory ‘/tmp/fenye’--2019-02-21 15:30:21--  https://my.oschina.net/yuanhaohao/blog/2994879Resolving my.oschina.net (my.oschina.net)... 120.55.226.24Connecting to my.oschina.net (my.oschina.net)|120.55.226.24|:443... connected.HTTP request sent, awaiting response... 200 Length: unspecified [text/html]Saving to: ‘2994879’2019-02-21 15:30:22 (680 KB/s) - ‘2994879’ saved [65766][root@fenye2019 fenye]# ls /tmp/fenye/2994879 /tmp/fenye/2994879存在的则正常:

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

分析:让用户一直输入,需要while 循环;

然后还需要判断用户输入的是否是正确的数字,比如包含英文特殊符号都不算合格的数字,小数也不应该对,用户(包括数字大于小于)要提示:  if  [ -n  "$2"  ]

注释:首先需要生成一个随机数字:   使用系统内置变量RANDOM并取余数       n=$[$RANDOM%100]                  echo   $n

[root@fenye2019 shell]# n=$[$RANDOM%100][root@fenye2019 shell]# echo $n16[root@fenye2019 shell]# n=$[$RANDOM%100][root@fenye2019 shell]# echo $n72

使用while 循环里 read  -p 来要求用户的输入:            read  -p   "please   input  number(1-100): " n1

然后判断输入的变量 n1 是否为空:    if  [ -z  "$n1" ]  then   echo  "必须输入一个数字"     continue    来继续循环输入

然后判断收入的变量n1 是否是存数字:    n2=`echo n1|sed 's#[0-9]##g'`     if  [ -n "$n2" ]  then  echo "you  input  not number"    continue

然后使用比较随机生成数和用户输入数做对比,         

  if  [ $n -gt $n1 ]  then   echo "你输入的数字小了,请重试"   continue

elif  [ $n -lt  $n1 ] then  echo "你输入的数字大了,请重试"   continue   else   echo "恭喜你猜对了"   break  

注释:用 if 来判断一个变量时,需要用双引号来引起来才可以;

脚本内容如下:

[root@fenye2019 shell]# cat 34.sh #!/bin/bashn=$[$RANDOM%101]while :do    read -p "pelase input nubmer(1-100): " n1    if [ -z "$n1" ]    then        echo "please input is number"        continue    fi    n2=`echo $n1|sed 's#[0-9]##g'`    if [ -n "$n2" ]    then        echo "please input 1-100"        continue    else        if [ $n -gt $n1 ]        then            echo "您输入的数字小了,请重试"            continue        elif [ $n -lt $n1 ]        then            echo "您输入的数字大了,请重试"            continue        else             echo "恭喜您答对了"             break         fi     fidone执行脚本:[root@fenye2019 shell]# sh 34.sh pelase input nubmer(1-100): please input is numberpelase input nubmer(1-100): 50您输入的数字大了,请重试pelase input nubmer(1-100): adsfsdfsdfplease input 1-100

5、有一个脚本,提示输入名字(英文的,可以是大小写字母,数字不能有其他特殊符号),然后输出一个随机的0-99的数字,脚本并不会退出,继续提示让输入名字;

输入相同的名字,输出的数字还是第一次输入该名字时输出的结果,前面已经输出过的数字,下次不能再出现;

当输入q和Q时,脚本会退出;

分析:如何判断输入的是名字 不是 特殊字符:       grep  [^0-9a-zA-Z]

如何去随机的数字0-99:   n=$[$RANDOM%100]           echo $n

脚本不退出,可以使用while 循环;判断输入的数字和字母是否重复,需要借助临时文件(之前输入过的都写入到这个文件里)

注释:假设输入的用户刚刚是一个数字,并且和某个用户的数字是一样,会出现问题:可以使用awk -v 中传递 shell 的参数;

awk  -v  uu=$u '$1==uu {print $2}'

脚本内容如下:

[root@fenye2019 shell]# cat 35.sh #!/bin/bashf=/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#[0-9a-zA-Z]##g'`    if [ -n "$u1" ]    then        echo "请输入大小写字母和数字的组合"        continue    else        if [ -f $f ]        then            u_n=`awk -v uu=$u '$1==uu {print $2}' $f`            if [ -n "$u_n" ]            then                echo "用户$u对应的数字是: $u_n"            else               j_n                echo "用户$u对应的数字是: $n"                echo "$u $n" >>$f             fi         else             j_n             n=$[$RANDOM%100]             echo "用户$u对应的数字是: $n"             echo $u $n >> $f        fi    fidone执行脚本:[root@fenye2019 shell]# sh 35.sh please input a username: user1用户user1对应的数字是: 63please input a username: user2用户user2对应的数字是: 76please input a username: 用户对应的数字是: 59please input a username: 59用户59对应的数字是: 50[root@fenye2019 shell]# sh 35.sh please input a username: q

 

转载于:https://my.oschina.net/yuanhaohao/blog/2999961

你可能感兴趣的文章
T-Mobile美国使用28GHz频段测试5G
查看>>
如何缓解影子云服务安全风险?
查看>>
Bossies 2016:最佳开源大数据工具
查看>>
银行卡信息安全事件频发 互联网站成数据泄露"重灾区"
查看>>
云服务器 ECS 使用OpenAPI管理ECS:使用OpenAPI弹性创建ECS实例
查看>>
象云2.0产品发布暨国产操作系统首次入驻公有云
查看>>
一个完美DCIM应该具备的功能与价值
查看>>
《SEO的艺术(原书第2版)》——1.5 人们如何搜索
查看>>
经验贴 | 电梯监控的布线技巧
查看>>
唐山联通与丰南区政府签署“智慧城市”战略合作协议
查看>>
研究显示:广告拦截应用正在破坏互联网
查看>>
优云·小课堂 第八期:运维自动化的魅力
查看>>
稳定+性能+价格,阿里云发力ECS企业级产品
查看>>
写个软件来防止服务器网站CPU百分百
查看>>
智能城市里,“公共电话亭”的存在意味着什么?
查看>>
JVM分代垃圾回收策略的基础概念
查看>>
《交互式程序设计 第2版》一3.5 捕获简单用户交互行为
查看>>
安装操作系统需要注意的事项
查看>>
5G技术的5大猜想
查看>>
MongoDB 3.0(1):CentOS7 安装MongoDB 3.0服务
查看>>