8月30日 函數練習和作業

1、編寫函數,實現OS的版本判斷

#!/bin/bash
os () {
      osnum=`sed -r 's/.* ([0-9])\..*/\1/' /etc/redhat-release`
     echo  "$osnum"
}
  
if [ `os` -eq 6 ];then
       echo "osversion is 6"
       elif [ `os` -eq 7 ];then
             echo "osversion is 7 "
       elif [ `os` -eq 5 ];then
              echo "osversion is 5"
  fi

2、編寫函數,實現取出當前系統eth0的IP地址

#!/bin/bash
ens38 () {
      ip=`ifconfig ens38|grep netmask|tr -s ' '|cut -d ' ' -f3`
              echo ipaddr=$ip
}
ens38

3、編寫函數,實現打印綠色OK和紅色FAILED

[root@redhat7 script]#cat ok.sh 
#!/bin/bash
#
. /etc/init.d/functions
action "success!" true
action "failed"   false
[root@redhat7 script]#./ok.sh 
success!                                                   [  OK  ]
failed                                                     [FAILED]

4、編寫函數,實現判斷是否無位置參數,如無參數,提示錯誤

#!/bin/bash
#
args () {
      if [ $# -eq 0 ];then
       . /etc/init.d/functions
       action "fail... you must input a parameter" false
      fi
}
args $1
[root@redhat7 script]#./weizhicanshu.sh 
fail... you must input a parameter                         [FAILED]

5、編寫服務腳本/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為當前腳本名
(7)在所有模式下禁止啟動該服務,可用chkconfig和service命令管理

#!/bin/bash
#chkconfig:- 96 07
#description
[ -f /etc/rc.d/init.d/`basename $0` ]||mv /app/script/`basename $0` /etc/rc.d/init.d/`basename $0`&>/dev/null
chkconfig --add `basename $0`
sta () {
             touch /var/lock/subsys/`basename $0`
             . /etc/init.d/functions
             action "`basename $0` start successful!" true
}
sto () {
         rm /var/lock/subsys/`basename $0`
              . /etc/init.d/functions
             action "`basename $0` is stopped" true
}
rest () {
         sto
         sta
}
statu () {
            if [ -f /var/lock/subsys/`basename $0` ];then
                   . /etc/init.d/functions
                    action "`basename $0` is running" true
             else
                      action "`basename $0` is stopped" true
            fi
}
case $1 in
start)
          if [ -f /var/lock/subsys/`basename $0` ];then
                    echo "`basename $0` is running"
           else
                 sta
          fi
                        ;;
stop)
             if [ -f /var/lock/subsys/`basename $0` ];then
                        sto
             else
                    echo "`basename $0` has been stopped before"
            fi
                     ;;
restart)
         if  [ -f /var/lock/subsys/`basename $0` ];then
                        sto
                        sta
           else
                   sta
            fi
                    ;;
status)
               statu
               ;;
esac

6、編寫腳本/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退出

#!/bin/bash
#
read -p "please input a excute cmd(eg:cat|bash|quit):" command
[ -a /mnt/sysroot ]||mkdir /mnt/sysroot &>/dev/null
cpdir () {
      cmd=`which --skip-alias $command`
      if [ -f  /mnt/sysroot$cmd ];then
           echo "the $cmd has been cp before"
       else
       local dir=`dirname $cmd`
         mkdir -p /mnt/sysroot$dir
         cp $cmd /mnt/sysroot$cmd
                echo "cp $cmd finished"
          fi
}
cplib () {
          cmd=`which --skip-alias $command`
          ldd $cmd |egrep -o "/lib64.* "|while read i;do
            if  [ ! -f /mnt/sysroot$i ];then
            local dir=`dirname $i`
             mkdir -p /mnt/sysroot$dir
                cp $i /mnt/sysroot$i     
                    echo "cp $i  finished"
            else
                   echo "$i has been cp before"
             fi
            done
}
type $command&>/dev/null||{ echo the command is not exsit;exit 100; }
until [ $command == quit ];do
type $command&>/dev/null||{ echo the command is not exsit;exit 100; }
cpdir
cplib
read -p "please input new excute cmd(eg:cat|bash|quit):" command
cmd=`which --skip-alias $command`
done

7、編寫函數實現兩個數字做為參數,返回最大值

#!/bin/bash
#
>/app/f1
max () {
        [ $# -ne 2 ]&&echo "you must input two number"&&exit 10
        until [ $# -eq 0 ];do
               echo $1 >>/app/f1  
                 shift
        done
               sort -nr /app/f1|head -n1
}
max $*

8、斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)
利用函數,求n階斐波那契數列

#!/bin/bash
#
read -p "請輸入斐波那契數列的階數:" n
func1 () {
         if [ $1 -eq 0 ];then
             echo 0
         elif [ $1 -eq 1 ];then
             echo 1
         else
              echo $[`func1 $[$1-1]`+`func1 $[$1-2]`]
         fi
}
     for i in `seq 0 $n`;do
          func1 $i
           done

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容