1. 程式人生 > >shell訓練營Day19

shell訓練營Day19

練習36
用shell實現,把一個文字文件中只有一個數字的行給打印出來。

參考答案


#!/bin/bash
while read line
do
    n=`echo $line |sed 's/[^0-9]//g'|wc -L`
    if [ $n -eq 1 ]
    then
    echo $line
    fi
done < 1.txt

練習37
系統logrotate工具,可以完成日誌切割、歸檔。寫一個shell指令碼實現類似的歸檔功能。
 
舉例: 假如服務的輸出日誌是1.log,要求每天歸檔一個,1.log第二天就變成1.log.1,第三天1.log.2, 第四天 1.log.3  一直到1.log.5。

#!/bin/bash
cd /data/logs
log=1.log
mv_log()
{
    [ -f $1 ] && mv $1 $2
}
[ -f 1.log.5 ] && rm -f 1.log.5
for i in `seq 4 -1 1`
do 
    j=$[$i+1]
    mv_log $log.$i $log.$j
done
mv 1.log 1.log.1

練習38
寫一個shell指令碼,把192.168.0.0/24網段線上的ip列出來。

#!/bin/bash
for i in `seq 1 254`
do 
    if ping -c 2 -W 2 192.168.0.$i >/dev/null 2>/dev/null
    then
    echo "192.168.0.$i 是通的."
    else
    echo "192.168.0.$i 不通."
    fi
done

練習39
寫一個shell指令碼,檢查指定的shell指令碼是否有語法錯誤,若有錯誤,首先顯示錯誤資訊,然後提示使用者輸入q或者Q退出指令碼,輸入其他內容則直接用vim開啟該shell指令碼。

#!/bin/bash
sh -n $1 2>/tmp/sh.err
if [ $? -ne 0 ]
then
    cat /tmp/sh.err
    read -p "請輸入q/Q退出指令碼。" c
    if [ -z "$c"]
    then
    vim $1
        exit 0
    fi
    if [ $c == q ] || [ $c == Q ]
    then
    exit 0
    else
    vim $1
    exit 0
    fi
else
    echo "指令碼$1沒有語法錯誤."
fi

練習40
輸入一串隨機數字,然後按千分位輸出。
 
比如輸入數字串為“123456789”,輸出為123,456,789。

#!/bin/bash
n=`echo $1|wc -L`
for d in `echo $1|sed 's/./& /g'`
do
    n2=$[$n%3]
    if [ $n2 -eq 0 ]
    then
    echo -n ",$d"
    else
    echo -n "$d"
    fi
    n=$[$n-1]
done |sed 's/^,//'
echo