shell練習題

chunyang315發表於2018-04-29
  1. 編寫shell指令碼,計算1-100的和
!#/bin/bash
##計算求和
##Writen by zcy 2018-4-28
sum=0

for i in `seq 1 100`; do
        sum=$[$i+$sum]
done

echo $sum

2 . 編寫shell指令碼,要求輸入一個數字,然後計算出從1到輸入數字的和,要求,如果輸入的數字小於1,則重新輸入,直到輸入正確的數字為止;

#!/bin/bash
##互動
##writen by zcy 2018-4-28
 #! /bin/bash

n=0
while [ $n -lt "1" ]; do
        read -p "Please input a number, it must greater than "1":" n
done

sum=0

for i in `seq 1 $n`; do
        sum=$[$i+$sum]
done

echo $sum

3 . 編寫shell指令碼,把/root/目錄下的所有目錄(只需要一級)拷貝到/tmp/目錄下

#! /bin/bash

cd /root
for f in `ls `; do
        if [ -d $f ] ; then
                cp -r $f /tmp/
        fi
done
~              

4 . 編寫shell指令碼,批量建立使用者user_00, user_01, … user_100並且所有使用者同屬於users組

 #! /bin/bash

groupadd users

for i in `seq 0 9`; do
        useradd -g users user_0$i
done



for j in `seq 10 100`; do
        useradd -g users user_$j
done

5 . 編寫shell指令碼,擷取檔案test.log中包含關鍵詞 ‘abc’ 的行中的第一列(假設分隔符為 ”:” ),然後把擷取的數字排序(假設第一列為數字),然後列印出重複次數超過10次的列

 #! /bin/bash

awk -F':' '$0~/abc/ {print $1}' test.log >/tmp/n.txt
sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt
awk '$1>10 {print $2}' /tmp/n2.txt

6 編寫shell指令碼,判斷輸入的IP是否正確(IP的規則是,n1.n2.n3.n4,其中1

#! /bin/bash

checkip() {

        if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then
                a=`echo $1 | awk -F. '{print $1}'`
                b=`echo $1 | awk -F. '{print $2}'`
                c=`echo $1 | awk -F. '{print $3}'`
                d=`echo $1 | awk -F. '{print $4}'`

                for n in $a $b $c $d; do
                        if [ $n -ge 255 ] || [ $n -le 0 ]; then
                                echo "the number of the IP should less than 255 and greate than 0"
                                return 2
                        fi
                done
        else

                echo "The IP you input is something wrong, the format is like 192.168.100.1"
                return 1
        fi

}



rs=1
while [ $rs -gt 0 ]; do
    read -p  "Please input the ip:" ip
    checkip $ip
    rs=`echo $?`
done

echo "The IP is right!"

作業題

  • shell指令碼中,怎麼做可以把某一行給註釋掉?

    在行首使用#來註釋掉

  • 如何執行一個shell指令碼呢?

sh  xx.sh   

或者給予X許可權後  ./xx.sh 




  • 為了方便管理,我們約定把shell指令碼都放到哪個目錄下?

    /usr/local/bin

  • 為了更好的除錯shell指令碼,我們可以加一個選項來觀察shell指令碼的執行過程,是哪個選項呢?

    -x選項

  • 使用date命令列印5天前的日期,要求日期格式為: xxxx-xx-xx

date --date "5 days ago" +"%Y-%m-%d"date --date "5 days ago" +"%F"
  • 指令碼中,變數賦值=左右2邊不能有空格

  • shell指令碼中如何使用數學運算

#!/bin/bash
a=1
b=3
c=$[$a+$b]
echo $c
  • shell指令碼中有一個命令可以實現指令碼和使用者互動,請問是哪個命令,怎麼使用?

read -p

  • 在shell中如何進行大小或者等於判斷?

-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於
-eq 等於
-ne 不等於

  • shell指令碼中,用什麼符合表示並且,用什麼符合表示或者?

並且 && 或者 ||

  • shell指令碼中,case邏輯判斷的結構是什麼樣的?
case 變數名 in
       value1)
          command
         ;;
       value2)
          command
          ;;
        *)
          command
          ;;
      esac
  • 列舉出shell指令碼中常用的迴圈結構。

for 變數名 in 條件; do …. done

while 條件; do … done

  • shell指令碼中函式的作用是什麼?函式結構是什麼樣的?

作用:就是把一段程式碼整理到了一個小單元中,並給這個小單元自定義名字,方便呼叫

function filename(){
           command
    }
  • 寫指令碼實現,把一個目錄下的所有檔案(不含有目錄)全部在檔案
    名後面加一個.bak
#!/bin/bash

    for i in `ls -al|grep -v 'd'|awk -F ' ' '{print $9}'`;do
        mv $i $i".bak"
    done
  • 編寫一個shell指令碼,講當前目錄下大小大於100K的檔案全部移動到/tmp/ 目錄下。
#!/bin/bash
     value=`ls -l|awk -F ' ' '{print $5,$NF}' | awk '{if($1>100) {print $NF}}'`
     for file in $value
     do
     mv $file /tmp/
     done
  • 寫一個小指令碼,獲取本機的HOSTNAME、IP地址以及DNS地址。
    hostname=`hostname`
    echo "hostname : " $hostname
    ip=`/sbin/ifconfig -a | grep 'inet addr' | awk -F ':' '{print $2}' | awk '{print $1}'`
   for i in $ip
      do
          echo  "`ifconfig | grep -B1 "$i" | grep -v 'inet addr' | awk '{print $1}'` "$i""
     done
    DNS=`cat /etc/resolv.conf |grep nameserver|grep -v '#'`
    echo  $DNS
  • 寫兩個小指令碼驗證break和continue在迴圈中的作用
for i in `seq 1 10`;do 
        if [ $i -ne 5 ];then
                echo $i
        else
                break
        fi
done

for i in `seq 1 10`;do 
        if [ $i -ne 5 ];then
                echo $i
        else
                continue
        fi
done
差別為,一個直接終止迴圈,一個終止不符合條件的輸出,迴圈將繼續。