shell习题-17

题目要求

假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),

并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。

参考答案

#!/bin/bash
mysql="/usr/local/mysql/bin/mysql -uroot -p123456"
if ! $mysql -e "show processlist" >/dev/null 2>/dev/null
then
    echo "MySQL service is down."
    exit
else
    $mysql -e "show slave status\G" 2>/dev/null >/tmp/slave.stat
    n=`wc -l /tmp/slave.stat|awk ‘{print $1}‘`
    if [ $n -eq 0 ]
    then
    echo "This is master."
    else
    echo "This is slave."
    #找出Slave_IO_Running和Slave_SQL_Running是yes 还是no
    egrep ‘Slave_IO_Running:|Slave_SQL_Running:‘/tmp/slave.stat|awk -F ‘: ‘ ‘{print $2}‘ > /tmp/SQL.tmp
    #如果为no则down掉了
    if grep -qw "No" /tmp/SQL.tmp
    then
        echo "The slave is down."
    fi
    fi
fi

题目要求

写一个支持选项的增加或删除用户的shell脚本,具体要求如下:

  1. 只支持三个选项:‘--del‘,‘--add‘,‘--help‘,输入其他选项报错。
  2. 使用‘--add‘时,需要验证用户名是否存在,存在则反馈存在,且不添加。 不存在则创建该用户,需要设置与该用户名相同的密码。
  3. 使用‘--del‘时,需要验证用户名是否存在,存在则删除用户及其家目录。不存在则反馈该用户不存在。?
  4. --help选项反馈出使用方法。
  5. 能用echo $?检测脚本执行情况,成功删除或添加用户为0,不成功为非0正整数。
  6. 能以英文逗号分割,一次性添加或者删除多个用户。例如 adddel.sh --add user1,user2,user3

参考答案

#!/bin/baash

#判断参数,零个参数或者大于两个参数,将要报错退出
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
    echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
    exit
fi

#useradd用户函数
ex_user()
{
  if ! id $1 2>/dev/null >/dev/null
    then
    useradd $1 && echo "$1 add successful."
    else
    echo $1 exist.
    fi
}

#删除用户
notex_user()
{
    if id $1 2>/dev/null >/dev/null
    then
    userdel $1 && echo "$1 delete successful."
    else
    echo $1 not exist.
    fi
}

case $1 in
    --add)
    if [ $# -eq 1 ]             //参数为1 直接报错退出
    then
        echo "Wrong, use bash $0 --add user or bash $0 --add user1,user2,user3..."
        exit
    else
        n=`echo $2| awk -F ‘,‘ ‘{print NF}‘`        //用户个数
        #用户个数大于1的,需要轮询下,创建,等于1的直接创建
        if [ $n -gt 1 ]
        then
            for i in `seq 1 $n`
            do
            username=`echo $2 |awk -v j=$i -F ‘,‘ ‘{print $j}‘`
            ex_user $username
            done
        else
        ex_user $2
        fi
    fi
    ;;
    --del)
    if  [ $# -eq 1 ]     //参数为1 直接报错退出
        then
            echo "Wrong, use bash $0 --del user or bash $0 --del user1,user2,user3..."
            exit
        else
            n=`echo $2| awk -F ‘,‘ ‘{print NF}‘`            //用户个数
            #用户个数大于1的,需要处理下创建,个数为1的直接删除
            if [ $n -gt 1 ]
            then
                for i in `seq 1 $n`
                do
                    username=`echo $2 |awk -v j=$i -F ‘,‘ ‘{print $j}‘`
            notex_user $username
                done
            else
        notex_user $2
            fi
        fi
        ;;
    --help)
        if  [ $# -ne 1 ]               //参数为1直接报错退出
        then
            echo "Wrong, use bash $0 --help"
            exit
        else

    echo "Use bash $0 --add username or bash $0 --add user1,user2,user3... add user."
    echo "    bash $0 --del username -r bash $0 --del user1,user2,user3... delete user."
    echo "    bash $0 --help print this info."
    fi
    ;;
    *)                 //其他情况,直接报错 告知情况
    echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
    ;;
esac

题目要求

写一个脚本: 计算100以内所有能被3整除的正整数的和

参考答案

#!/bin/bash
sum=0
for i in `seq 1 100`
do
    j=$[$i%3]
    if [ $j -eq 0 ]
    then
    sum=$[$sum+$i]
    fi
done
echo $sum

题目要求

使用传参的方法写个脚本,实现加减乘除的功能。
例如:??sh??a.sh??1???2,这样会分别计算加、减、乘、除的结果。

要求:

  1. 脚本需判断提供的两个数字必须为整数
  2. 当做减法或者除法时,需要判断哪个数字大,减法时需要用大的数字减小的数字,除法时需要用大的数字除以小的数字,并且结果需要保留两个小数点。

参考答案

#!/bin/bash
is_nu()
{
    n=`echo $1 |sed ‘s/[0-9]//g‘`
    if [ -n "$n" ]
    then
    echo "给出的参数必须是正整数"
        exit
    fi
}
if [ $# -ne 2 ]
then
    echo "必须要输入两个参数"
    exit
else
    is_nu $1
    is_nu $2
fi

big()
{
    if [ $1 -gt $2 ]
    then
    echo $1
    else
    echo $2
    fi
}

small()
{
    if [ $1 -lt $2 ]
    then
        echo $1
    else
        echo $2
    fi
}

add()
{
    sum=$[$1+$2]
    echo "$1+$2=$sum"
}

jian()
{
   b=`big $1 $2`
   s=`small $1 $2`
   cha=$[$b-$s]
   echo "$b-$s=$cha"
}

cheng()
{
    ji=$[$1*$2]
    echo "$1x$2=$ji"
}
chu()
{
   b=`big $1 $2`
   s=`small $1 $2`
   v=`echo "scale=2;$b/$s"|bc`
   echo "$b/$s=$v"
}

add $1 $2
jian $1 $2
cheng $1 $2
chu $1 $2

题目要求

写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。

参考答案

#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
    echo "请输入一个纯数字."
    continue
    fi
    if echo $n |grep -qi ‘end‘
    then
    exit
    fi
    n1=`echo $n|sed ‘s/[0-9]//g‘`
    if [ -n "$n1" ]
    then
    echo "请输入一个纯数字."
        continue
    else
    echo "你输入的数字是: $n"
        continue
    fi
done

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

时间: 2024-11-02 23:11:01

shell习题-17的相关文章

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 学习17 - Shell for 循环

与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command1 command2 ... commandN done 列表是一组值(数字.字符串等)组成的序列,每个值通过空格分隔.每循环一次,就将列表中的下一个值赋给变量. in 列表是可选的,如果不用它,for 循环使用命令行的位置参数. 例如,顺序输出当前列表中的数字: for loop in 1 2 3 4 5 do echo "The value is: $loop" d

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

C#大学课程(第五版)课后习题17.4序列化和去序列化

/*17.4 (序列化和去序列化)修改前面的程序,使其能利用可以被序列化和去序列化的类对象*/using System;[ Serializable ]class ClassGrade{ public string Last { get; set; } public string First { get; set; } public string Id { get; set; } public string Class { get; set; } public string Grade { ge

C#大学课程(第五版)课后习题17.3学生成绩文件

/*17.3(学生成绩文件) 创建一个程序,它将学生的成绩保存到一一个文本文件中.这个文件应当包含每位学生的姓名.ID 号.课程以及成绩信息.应允许用户载人文件并以只读文本框模式显示它的内容.显示信息时应具有如下的格式:LastNane,FirstName: ID# Class Grade一些数据样本如下:Jones,Bob: 1 "Introduction to Computer Science" "A-"Johnson,Sarah: 2 "Data S

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