腳本作業–函數練習

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

1GIF.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

2GIF.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

3GIF.gif

原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/38904

(0)
苦澀咖啡苦澀咖啡
上一篇 2016-08-24 21:22
下一篇 2016-08-24 21:22

相關推薦

  • 第六周練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; 1.[root – www ~]#>cp /etc/rc.d/rc.sysinit /tmp/2.[root – www ~]#>vi /tmp…

    Linux干貨 2016-12-11
  • Linux進程篇16.3ps命令:進程管理工具

    ps命令:進程管理工具

    Linux干貨 2017-12-18
  • 計劃任務

    任務計劃Linux任務計劃、周期性任務執行未來的某時間點執行一次任務:atbatch:系統自行選擇空閑時間去執行此處指定的任務周期性運行某任務:cron     at任務at命令:at [option] TIME常用選項:-V 顯示版本信息:-l: 列出指定隊列中等待運行的作業;相當于atq-d: 刪除指定的作業;相當于atrm-c: 查…

    Linux干貨 2017-08-28
  • Linux基礎之shell腳本編程(二)

    1、寫一個腳本,完成以下功能    (1) 假設某目錄(/etc/rc.d/rc3.d/)下分別有K開頭的文件和S開頭的文件若干;    (2) 顯示所有以K開頭的文件的文件名,并且給其附加一個stop字符串;    (3) 顯示所有以S開頭的文件的文件名,并且給其附加一個start字符串; &nb…

    Linux干貨 2016-11-17
  • 文件查看和正則表達式

    文件查看工具         cat,tac,rev,more,less,head,tail cat:查看文本          cat [OPTION]… [FILE]… &…

    Linux干貨 2016-08-07
  • wordpress和discuz的負載均衡(lvs-nat)

    實驗目的:利用lvs-nat模型實現wordpress和discuz的負載均衡 實驗要求:客戶端訪問wordpress或Discuz服務時,無論被調度至哪臺RS上,其會話和訪問的頁面都應保持一致; 實驗環境:一臺server用作VS(需要兩塊網卡,eth1連接內部網絡,eth0連接外部網絡),兩臺server用作RS,一臺server用于部署mysql、NF…

    2017-05-13
欧美性久久久久