腳本練習2---函數

1、編寫服務腳本/root/bin/testsrv.sh,完成如下要求
(1) 腳本可接受參數:start, stop, restart, status
(2) 如果參數非此四者之一,提示使用格式後報錯退出
(3) 如是start:則創建/var/lock/subsys/SCRIPT_NAME, 並顯示“啓動成功”
考慮:如果事先已經啓動過一次,該如何處理?
(4) 如是stop:則刪除/var/lock/subsys/SCRIPT_NAME, 並顯示“停止完成”
考慮:如果事先已然停止過了,該如何處理?
(5) 如是restart,則先stop, 再start
考慮:如果本來沒有start,如何處理?
(6) 如是status, 則如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示“SCRIPT_NAMEis running...”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示“SCRIPT_NAME is stopped...”

其中:SCRIPT_NAME爲當前腳本名

[root@fengl bin]# cat testsrv.sh 
#!/bin/bash

name=`basename $0`
filename=/var/lock/subsys/$name
creatfile ()
{
    if [ -f ${filename} ] ;then
        echo "程序已啓動,正在運行...";exit
    else 
        echo "程序正在啓動..."
        touch ${filename}
        [ $? -eq 0 ] && echo "啓動成功"
    fi
}
delfile ()
{
    if [ -f ${filename} ] ;then
        echo "程序正在停止..."
        rm -f ${filename} && echo "停止成功"
    else 
        echo "程序未運行"
    fi    
}
stat ()
{
    if [ -f ${filename} ];then
        echo "${name} is running ..."
    else
        echo "${name} is stopped ..."
    fi
}
case $1 in
start)
    creatfile
    ;;
stop)
    delfile
    ;;
restart)
    delfile
    creatfile
    ;;
status)
    stat
    ;;
*)
    echo "輸入格式錯誤";exit
    ;;
esac

wKiom1e9GvKBaosHAALyEjdP2Mk672.gif

2、編寫腳本/root/bin/copycmd.sh
(1) 提示用戶輸入一個可執行命令名稱;
(2) 獲取此命令所依賴到的所有庫文件列表
(3) 複製命令至某目標目錄(例如/mnt/sysroot)下的對應路徑下;
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd
(4) 複製此命令依賴到的所有庫文件至目標目錄下的對應路徑下:
如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次複製完成一個命令後,不要退出,而是提示用戶鍵入新的要複製的命令,並重復完成上述功能;直到用戶輸入quit退出

[root@fengl bin]# cat copycmd.sh 
#!/bin/bash

copydir="/mnt/sysroot"
[ ! -d ${copydir} ] && mkdir ${copydir}
bincopy () {
    if which $1 &> /dev/null ;then
        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname ${cmd_path}`
        [ -d ${copydir}${bin_dir} ] || mkdir -p ${copydir}${bin_dir}
        [ -f ${copydir}${cmd_path} ] || cp ${cmd_path} ${copydir}${bin_dir}
        echo "${cmd_path}---->文件複製完成"
    else
        echo "輸入的命令不存在";exit
    fi
}

libcopy () {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in ${lib_list};do
        local lib_dir=`dirname ${loop}`
        [ -d ${copydir}${lib_dir} ] || mkdir -p ${copydir}${lib_dir}
        [ -f ${copydir}${loop} ] || cp ${loop} ${copydir}${lib_dir}
        echo "${loop}---->文件複製完成"
    done
}

    read -p "請輸入一個可執行命令:" cmd
while [ "${cmd}" != "quit" ];do
    if bincopy ${cmd} ;then
    libcopy ${cmd}
    fi
    read -p "請輸入一個可執行命令或退出(quit):" cmd
done

wKioL1e9GmaC36snAAHV-3Zugzo885.gif

3、漢諾塔(又稱河內塔)問題是源於印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
利用函數,實現N片盤的漢諾塔的移動步驟

[root@fengl bin]# cat heneita.sh 
#!/bin/bash

step=0
heneita () {
    [[ ! $1 =~ ^[1-9][0-9]*$ ]] && echo "輸入錯誤,請重新輸入碟子的數量" && exit
    if [ $1 -eq 1 ] ; then
        let step++
        echo "$step: move plate $1   $2------>$4"
    else
        heneita "$[$1-1]" $2 $4 $3
        let step++
        echo "$step: move plate $1   $2------>$4"
        heneita "$[$1-1]" $3 $2 $4
    fi
}
read -p "請輸入碟子的數量:" number
heneita $number A B C

wKiom1e9GniBuI1-AAJIK-oepQY604.gif

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