shell习题-18

题目要求

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

  1. 输入的字符不符合网卡名字规范,怎么应对。
  2. 名字符合规范,但是根本就没有这个网卡又怎么应对。

参考答案

#!/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 addreess is:"
        for ip in `cat /tmp/$1.txt`
    do
        echo -e "\033[33m$ip\033[0m"
    done
    fi
}

if_ip $eth

题目要求

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

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

参考答案

#!/bin/bash
if [ $# -eq 0 ]
then
    echo "当前目录下的文件是:"
    ls .
else
    for d in [email protected]
    do
    if [ -d $d ]
    then
        echo "目录$d下有这些子目录:"
        find $d -type d
    else
        echo "并没有该目录:$d"
    fi
    done
fi

题目要求

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

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

参考答案

#!/bin/bash
if [ $# -ne 2 ]
then
   echo "你必须要输入两个参数,第一个参数是网址,第二个参数是目录."
   exit 1
fi

if [ ! -d $2 ]
then
    while :
    do
    echo "你输入的第二个参数,并不是一个存在的目录。是否要创建该目录呢?(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 [ $? -eq 0 ]
    then
    exit 0
    else
    echo "下载失败."
    exit 52
    fi
fi

题目要求

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

参考答案

#!/bin/bash
n=$[$RANDOM%101]
while :
do
    read -p "请输入一个0-100的数字:" 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 "你输入的数字小了,请重试。"
        continue
    elif [ $n -lt $n1 ]
    then
        echo "你输入的数字大了,请重试。"
        continue
    else
        echo "恭喜你,猜对了!"
        break
    fi
    fi
done

题目要求

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

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

参考答案

#!/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}‘ $f`
        if [ -n "$u_n" ]
        then
        echo "用户$u对应的数字是:$u_n"
        else
        j_n
        echo "用户$u对应的数字是:$n"
            echo "$u $n" >>$f
        fi
    else
        j_n
        echo "用户$u对应的数字是:$n"
        echo $u $n >> $f
    fi
    fi
done

原文地址:https://blog.51cto.com/865516915/2435242

时间: 2024-11-10 16:04:22

shell习题-18的相关文章

linux shell习题训练

shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2306 打印当前sshd的端口和进程id,处理结果: sshd Port&&pid: 22 5412 输出本机创建20000个目录所用的时间,处理结果: real 0m3.367s user 0m0.066s sys 0m1.925s 打印本机的交换分区大小,处理结果: Swap:1024M

shell习题-20

题目要求 编写一个问候程序,它执行时能根据系统当前的时间向用户输出问候信息.假设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上. 参考答案 if [ -a ] 并且的意思 #!/bin/bash d=`date +%H` if [ $d -ge 0 -a $d -lt 7 ] then tag=1 elif [ $d -ge 7 -a $d -lt 12 ] then tag=2 elif [ $d -ge 12 -a $d -lt 18 ] then tag=3 else ta

shell习题-24

有两个文件a.txt和b.txt,需求是,把a.txt中有的但b.txt中没有的行找出来,并写入到c.txt,然后计算c.txt文件的行数. 参考答案 #grep -f a.txt b.txt #下边的方法练习逻辑能力 #!/bin/bash #这个脚本用来比较文件差异 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-07 cat a.txt|while read line do if ! grep -q "$line" b.txt then echo $

shell学习:几道常见shell习题

1. 编写shell脚本,计算1-100的和: 2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止: 3. 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下: 4. 编写shell脚本,批量建立用户user_00, user_01, … ,user_100并且所有用户同属于users组: 5. 编写shell脚本,截取文件test.log中包含关键词’abc’的行中的第一列

shell习题-批量同步代码

需求背景是: 一个业务,有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具.有新的需求时,开发同事改完代码会把变更上传到其中一台服务器A上.但是其他2台服务器也需要做相同变更. 写一个shell脚本,把A服务器上的变更代码同步到B和C上. 其中,你需要考虑到不需要同步的目录(假如有tmp.upload.logs.caches) #!/bin/bash echo "该脚本将会把A机器上的/data/wwwroot/www.aaa.com目录同步到B,C机器上&quo

shell习题-清理日志

要求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件.在堡垒机批量发布,也要批量发布到crontab里面. A类机器日志存放路径很统一,B类机器日志存放路径需要用*匹配(因为这个目录里除了日志外,还有其他文件,不能删除.匹配的时候可用*.log) A类:/opt/cloud/log/   删除7天前的B类: /opt/cloud/instances/  删除15天前的 要求写在一个脚本里面.不用考虑堡垒机上的操作,只需要写出shell脚本. #!/bin/bash dir1=/

shell习题-判断函数

请使用条件函数if撰写一个shell函数 函数名为 f_judge,实现以下功能 1)当/home/log 目录存在时 将/home目录下所有tmp开头的文件或目录移/home/log 目录. 2)当/home/log目录不存在时,创建该目录,然后退出. #!/bin/bash f_judge (){     if [ -d /home/log ]     then          mv /home/tmp* /home/log/     else         mkdir -p /home

shell习题第10题:打印每个单词的字数

[题目要求] 用shell打印下面这句话中字母数小于6的单词. Bash also interprets a number of multi-character options. [核心要点] for循环遍历所有单词 wc -L获取字符串长度 [脚本] #!/bin/bash c="Bash also interprets a number of multi-character options." n=`echo $c|awk -F '[ +-.]' '{print NF}'` for

shell习题第27题:带选项的增删用户脚本

[题目要求] 写一个支持选项的增加或删除用户的shell脚本 #!/bin/bash if [ $# -eq 0 ]; then echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 -- help" exit fi exist_user() { if ! id $1 2>/dev/null >/dev/null then echo $i not exist fi } ca