1. 程式人生 > >Shell練習(十四)

Shell練習(十四)

shell

習題1:打印只有一個數字的行

要求:如題,把一個文本文檔中只有一個數字的行給打印出來

參考答案:

#!/bin/bash
# date:2018年3月16日
f=/etc/group
line=`wc -l $f|awk '{print $1}'`
for l in `seq 1 $line`
do
    n=`sed -n "$l"p $f|grep -o '[0-9]'|wc -l`
    if [ $n -eq 1 ]
    then
        sed -n "$l"p $f
    fi
done

習題2:抽簽腳本

要求:

1、寫一個腳本執行後,輸入名字,產生隨機數01-99之間的數字。

2、如果相同的名字重復輸入,抓到的數字還是第一次抓取的結果,

3、前面已經抓到的數字,下次不能在出現相同數字。

4、第一個輸入名字後,屏幕輸出信息,並將名字和數字記錄到文件裏,程序不能退出

繼續等待別的學生輸入。

參考答案:

#!/bin/bash
# date:2018年3月16日
while :
do
    read -p "please input your name:" name
    if [ -f /tmp/draw.log ];then
        a=`cat /tmp/draw.log | awk -F ":" '{print $1}'| grep "$name"`

    if [ "$a" != "$name" ];then
        number=`echo $RANDOM |awk -F "" '{print $2 $3}'`
        while :
        do
            c=`cat /tmp/draw.log |awk -F ":" '{print $2}'|grep "$number"`
            if [ "$number" == "$c" ];then
                echo "number exist."
                number=`echo $RANDOM | awk -F "" '{print $2 $3}'`
            else
                break
            fi
        done
        echo "$name:$number"|tee -a /tmp/draw.log
    else
        number=`cat /tmp/draw.log | grep "$name" | awk -F ":" '{print $2}'`
        echo $number
        echo "repeat name."
    fi
else
    number=`echo $RANDOM |awk '{print $2 $3}'`
    echo "$name: $number"|tee -a /tmp/draw.log
fi
done


習題3:猜數字

要求:寫一個猜數字腳本,當用戶輸入的數字和預設數字(隨機生成一個小於100的數字)一樣時,直接退出,否則讓用戶一直輸入,並且提示用戶的數字比預設數字大或者小。

參考答案:

#!/bin/bash
# date:2018年3月16日
n=`echo $RANDOM |awk -F "" '{print $2 $3}'`
while :
do
    read -p "please guess in [0-99]:" m
    expr $m + 1 >/dev/null 2>&1
    if [ $? -ne "0" ];then
        echo -e "\033[41;37m please input number! \033[0m"
        continue
    fi
    if [ $n -eq $m ];then
        echo -e "\033[34m bingo! \033[0m"
        exit
    elif [ $n -lt $m ];then
        echo "bigger!"
        continue
    else
        echo "smaller!"
        continue
    fi
done

習題4:下載文件

要求:創建一個函數,能接受兩個參數:

1.第一個參數為URL,即可下載的文件;第二個參數為目錄,即下載後保存的位置;

2.如果用戶給的目錄不存在,則創建目錄

3.如果給的目錄存在,則下載文件;下載命令執行結束後測試文件下載成功與否;如果成功,則>返回0給調用腳本,否則,返回2給調用腳本;

參考答案:

#!/bin/bash
# date:2018年3月16日
if [ $# -ne 2 ];then
    echo "Usage $0 URL dirname"
    exit 1
fi
[ ! -d $2 ] && mkdir -p $2
cd $2
wget $1
if [ $? -eq 0 ];then
    echo "download ok!"
    exit 0
else
    echo "fail!!!"
    exit 2
fi

習題5:列出子目錄

要求:腳本可以帶參數也可以不帶,參數可以有多個,每個參數必須是一個目錄,腳本檢查參數個數,若等於0,則列出當前目錄本身;否則,顯示每個參數包含的子目錄

參考答案:

#!/bin/bash
# date:2018年3月16日
if [ $# == 0 ];then
    ls -ld `pwd`
else
    for i in `seq 1 $#`
    do
        a=$i
        echo "ls ${!a}"
        ls -l ${!a} |grep '^d'
    done
fi

習題6:獲取網卡ip

要求:提示用戶輸入網卡的名字,然後我們用腳本輸出網卡的ip。 看似簡單,但是需要考慮多個方面,比如我們輸入的不符合網卡名字的規範,怎麽應對。名字符合規範,但是根本就沒有這個網卡有怎麽應對

參考答案:

#!/bin/bash
# date:2018年3月16日
while :
do
    read -p "please input a network name: " e
    e1=`echo "$e" | sed 's/[0-9]//g'`
    e2=`echo "$e" | sed 's/[a-zA-Z]//g'`
    if [ -z $e ];then
        echo "you input nothing"
        continue
    elif [ -z $e1 ];then
        echo "you input number? but network name start with ens+number. "
        continue
    elif [ -z $e2 ];then
        echo "you input letter ? but network named ens+number "
        continue
    else
        break
    fi
done

ip(){
    ifconfig| grep -wA1 "$1:"|tail -1|awk '{print $2}'
}
myip=`ip $e`
if [ -z $myip ];then
    echo "sorry, the network $e is not exist."
else
    echo "your network ip is: $myip"
fi


Shell練習(十四)