shell编程练习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程练习相关的知识,希望对你有一定的参考价值。

第一题:
    编写脚本,求100以内所有正奇数之和
    答案1:
    #!/bin/bash
    sum=0
    for n in `echo {1..100..2}`;do
            sum=$[$sum+$n]
    done

            echo $sum

    答案2:
    #!/bin/bash
    #编写脚本,求100以内所有正奇数之和
    #author :       sunxuefeng
    #date   :       20180213
    echo `seq 1 2 100` |tr " " "+" |bc

    答案3:
    j=0
    for i in `seq 1 100 | sed -n '1~2p'`;do
        j=$[i+j]
    done
    echo $j

    答案4:
    j=0
    for i in {1..100};do
        if [ $[$i%2] -ne 0 ];then
    let j+=i
        fi
    done
    echo $j

第二题:
    编写一个脚本能打印9*9乘法表如下:
    1*1=1
    2*1=2 2*2=4
    3*1=3 3*2=6 3*3=9
    ……

    答案1:
    #!/bin/bash
    for i in {1..9};do
        for j in `seq 1 $i`;do
                echo -n -e "$i"X"$j=$[i*j]\t"
        done
        echo
    done

    答案2:
    for ((i=1;i<=9;i++))
    do
      for ((j=1;j<=i;j++))
      do
        echo -n "$i*$j=$[$i*$j] "

      done

      echo
    done

    答案3:
    for i in {1..9}
    do
            for j in {1..9}
                    do  
                            if [ ${j} -lt  ${i} ]
                            then
                                            k=$((i * j))
                                            echo -n ${i}*${j}=${k}$'\t'
                            elif [ ${j} -eq ${i} ]
                            then
                                            k=$((i * j))
                                            echo ${i}*${j}=${k}
                            else
                                    break
                            fi  
                    done
    done  

第三题:
    随机生成一个10以内的数字,然后写一个猜数字的游戏,若输入的值比随机的值大,则提示大,再输入,若小,则提示小,若相等则提示win。
    suiji=`echo $[$RANDOM%10]`
    while true ;do
            read -p "请输入一个10以内的数 : " n
            if [ $n -gt 10 ] ;then
                    echo "你输入数大于10"
                    break
            elif [ $n -gt $suiji ] ;then
                    echo "输入值大于随机数"
            elif [ $n -lt $suiji ] ;then
                    echo "输入值小于随机数"
            elif [ $n -eq $suiji ] ;then
                    echo "win"
                    break
            fi
    done


第四题:
    在centos7中编写脚本,自动对/root/httpd-2.4.29.tar.bz2下的文件进行解压、编辑、安装、自动启动服务,自动关闭防火墙。即只要执行脚本后,便可通过浏览器访问本机的ip,看到网页内容为 “春节快乐”。

    答案:
    tar -xvf /root/httpd-2.4.29.tar.bz2
    cd /root/httpd-2.4.29/
    ./configure --prefix=/app/http29 --sysconfdir=/etc/httpd29
    make
    make install
    /app/http29/bin/apachectl start
    echo '<html><body><h1>新年快乐</h1></body></html>' > /app/http29/htdocs/index.html

第五题:

编写一个创建用户的脚本,要求以下功能
    a.提示用户输入希望创建的用户名(当用户超时8秒不输入,提示超时并退出)
    b.检测用户名是否已存在,若用户不存在,则进入第c步骤,若用户存在则提示用户是否要对该用户设置密码,若用户输入yes、YES、y、Y时则跳至d步骤,如输入其他,或超时8秒均退出。
    c.用户创建完成后提示用户是否要继续设置密码,若用户输入yes、YES、y、Y时则继续下一步,如输入其他,或超时8秒均退出。
    d.接上一步,为用户设置密码,首先提示用户输入要设置的密码,密码的输入过程不可见。
    e.对用户上一步所输入的密码进行长度检测,若少于5位(包含5位),则提示用户密码太短,请重新输入。
    f.对用户在第d步所输入的密码进行复杂度检测,若所输入的内容与/usr/share/dict/words 字典中的某一行条目完全一致,则提示密码是一个常见单词,请重新输入。若第e/f两步的密码错误次数一共超过3次,则提示错误次数过多,并退出。
    g.再一次让用户输入密码,若第二次输入的密码与在第d步输入的不一致,则提示用户两次密码不一致,请重新输入,则跳回至第d步。
    h.d至g步骤全部通过后,为用户设置密码后,并提示密码已成功设置。最后正确退出。
    以上的所有退出情况应给出不同的返回值。

    答案:
    #!/bin/bash
    #
    changepasswd() {
    #密码修改
    wrongtime=3
    while [ $wrongtime -ne 0 ] ;do
            for   (( i=4;i>=1;i-- )) ; do
                    if [ $i -eq 1  ];then
                            echo "错误次数超过3次";exit 5
                    fi
                    #设置密码
                    read -p "请输入密码  : " -s passwd1
                    #密码长度检测
                    if [  $(echo $passwd1|wc -m ) -le 6  ] &> /dev/null ;then
                            echo "设置密码太短"
                            continue
                    fi
                    #密码复杂度检测
                    egrep "\b$passwd1\b" /usr/share/dict/words >& /dev/null
                    if [ $? -eq 0 ] ; then
                            echo "密码设置为常见单词,请重设置密码"
                            continue
                    else
                            echo
                            break  
                    fi

            done
            #确认输入密码
            read -p "请确认输入密码  : " -s  passwd2
            if [ `echo $passwd1` == `echo $passwd2`  ];then
                    echo
                    echo $passwd1 |passwd --stdin $name &> /dev/null
                    echo "密码设置成功"
                    break
            else
                    echo
                    echo "密码不一致,请重新输入"
                    wrongtime=$[$wrongtime-1]
                    continue
            fi
    done
    }
    read -t 8  -p "输入希望创建的用户名 :" name   
    if [ $? -ne 0 ] ;then
            echo
            echo "用户名输入超时" ;exit 1
    fi
    #检测用户名是否存在
    id $name >& /dev/null
    if [ $? -eq 0 ] ; then
            read -t 8 -p "用户存在,是否继续设置密码,从yes.YES.y.Y中选择 :" go
    else
            useradd $name
            read -t 8 -p "用户创建成功,是否继续设置密码,从yes.YES.y.Y中选择 :" go
    fi
    #选择设置密码&&输入密码
    if [ $? -ne 0 ] ;then
            echo
            echo "输入超时" ;exit 2
    fi
    case $go in
            yes|YES|y|Y)changepasswd;;
                      *)exit 6
    esac
    exit 0


第六题:
    编写一个录入个人信息的脚本/root/bin/information.sh,要求如下:
    1.提示用户输入username(需对名字进行字符要求检查,用户名中不能模糊包含系统中任何一个已在存在用户名,如不能为helloroot1,123bin,ggntp2等。且要求username要以大写字母开头,长度至少5个字符。
    2.提示用户输入性别,仅能输入male或female,输入其他的提示用户重试。
    3.提示用户输入生日,格式必须为yyyy-mm-dd,并对日期的合法性进行检查,若输入2018-02-30等与现实不符的日期,则提示日期错误,请重试。
    4.提示用户输入手机号,长度仅能11位,且务必以13x,18x,15x,17x开头,若错误则提示用户重新输入。
    5.提示用户输入身份证号,长度可为18位,格式前17位均为数字。要求第7位至第14位所填的内容与第3步的生日符合。同时要求第17位所填的数字若为奇数,那么第2位所填写的性别应为male,反之偶数应为female。最后1位可为数字或x。
    6.将以上输入的信息以:为分隔符,保存至/root/info.txt中,每次输入一个用户,会向下追加一行。
        如Zhangsan:male:1999-12-20:13588291219:4101011999122030051

   答案:

#!/bin/bash
flag=1
while true;do
        read -p "请输入用户名 " username

        if  $(echo "$username" |egrep '^[[:upper:]].{4,}' &> /dev/null) ;then
                true
        else
                echo "请输入首字母大写的高于5位的字符"
                continue
        fi
        for n in `cat /etc/passwd |cut -d: -f1`;do
                echo $username| grep $n &> /dev/null
                if [ $? -eq 0 ];then
                        flag=0
                        break
                fi
        done
        if [ $flag -eq 0 ];then
                echo 包含敏感字符
                exit 1
        else
                break
        fi
done
#------------------------------------------------------------------------------------------------------------
while true;do
read -p "请输入性别(male,female) " sex
        case $sex in
                male|female)break;;

                *)echo 输错了;continue ;;
        esac
done
#---------------------------------------------------------------------
while true;do
read -p "输入生日 " bir
echo $bir|egrep '[[:digit:]]{4}(-[[:digit:]]{1,2}){2}' &> /dev/null
if [ $? -eq 0 ] ;then
        biry=$(echo $bir|cut -d- -f1)
        birm=$(echo $bir|cut -d- -f2)
        bird=$(echo $bir|cut -d- -f3)
        if $(cal $bird $birm $biry &> /dev/null) ;then
                break
        else
                echo "不合法"
                continue
        fi
else
        echo 格式不合法
        continue
fi
done
#------------------------------------------------------------------------------

while true ;do
        read -p "请输入手机号 " num
        echo $num |egrep '\<1[3857][[:digit:]]{9}\>' &> /dev/null
        if [ $? -eq 0 ];then
                break
        else
                echo "格式不对"
                continue
        fi
done
#---------------------------------------------------------------------------------

while true ;do
        read -p "请输入身份证号 " id
        echo $id |egrep '[[:digit:]]{17}[[:digit:]x]' &> /dev/null
        if [ $? -eq 0 ];then
                biry1=`echo $id |cut -c 7-10`
                birm1=`echo $id |cut -c 11-12`
                bird1=`echo $id |cut -c 13-14`
                if [ $(echo -n $birm|wc -m) -eq 1 ];then
                        birm=0$birm
                fi
                if [ $(echo -n $bird|wc -m) -eq 1 ];then
                        birm=0$bird

                fi
                if [ "$biry$birm$bird" == $biry1$birm1$bird1 ];then
                        shu=$[$(echo $id|cut -c 17)%2]
                        case $shu in
                                1)xingbie=male
                                if [ "$xingbie" != "$sex" ];then
                                        echo "性别错了"
                                        continue
                                else
                                        break
                                fi;;
                                *)xingbie=female
                                if [ "$xingbie" != "$sex" ];then
                                        echo "性别错了"
                                        continue
                                else
                                        break
                                fi;;
                        esac

                else
                        echo "日期不符"
                        continue
                fi
        else
                echo 格式不对
                continue
        fi
done
#----------------------------

echo "$username:$sex:$bir:$num:$id">>/app/info.txt                                                    
             

第七题:
    利用第六题的脚本,输入20个用户信息。
    编写一个抽奖系统的脚本 ,可对/root/info.txt文件中的手机号进行随机抽奖,将中奖的手机号打印出来,要求第4-7位显示为*,即135****1219

    答案:
    numlist=$(cat -n /app/jobs_20180213_jiaqi/info.txt |wc -l)
    randnum=$(echo $[$RANDOM%$numlist+1]) #标记行号是从1开始的,所以随机求余数范围最小是1,最大是numlist -> numli
    st-1
    sed -n "${randnum}p" /app/jobs_20180213_jiaqi/info.txt |cut -d: -f4 |sed -r "s/\<([[:digit:]]{3}).*([[:digit:
    ]]{4})\>/\1****\2/"

以上是关于shell编程练习的主要内容,如果未能解决你的问题,请参考以下文章

SHELL编程四剑客练习--grep

OpenStack 环境下 SHELL 编程练习(持续更新中)

SHELL编程四剑客练习--awk

shell编程练习-打印九九乘法表(附:awk编程)

shell编程练习

shell脚本,编程题练习。