Shell練習(十四)
阿新 • • 發佈:2018-03-16
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練習(十四)