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/"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章