編寫服務腳本/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為當前腳本名
prog=$0 lockfile=/var/lock/subsys/$prog cat << EOF enter your optipn ================= start) stop) restart) status) quit) ================ EOF read -p "enter start, stop, restart, status, quit:" option start() { if [ ! -f $lockfile ];then touch $lockfile [ $? -eq 0 ] && echo "start $prog finished" else echo "$prog is running " fi } stop() { if [ -f $lockfile ];then rm -rf $lockfile [ $? -eq 0 ] && echo "stop $prog finished" else echo "$prog is not running" fi } status() { if [ -f $lockfile ];then echo "$prog is running" else echo "prog is not runing" fi } case $option in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; quit) exit 0 ;; *) echo "enter your option again" exit 2 ;; esac
編寫腳本/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 # f_dir=/mnt/sysroot cmd_input () { while true do read -p "Please input an excuteable command to backup (quit to exit): " cmd if [[ -z $cmd ]];then echo "wrong option,try again..." continue elif [[ $cmd == "quit" ]];then exit 88 elif ! which --skip-alias $cmd &>/dev/null;then echo "No such command,try again..." continue else break fi done } cp_cmd() { cmd_path=`which --skip-alias $cmd` cmd_dir=`dirname $cmd_path` [ ! -d $f_dir$cmd_dir ] && mkdir -p $f_dir$cmd_dir cp $cmd_path $f_dir$cmd_dir && echo "backup $cmd finished" } cp_cmd_lib() { cmd_lib=`ldd $cmd_path` for path in $cmd_lib do cmd_lib_dir=`echo $path | grep -o -E '/[^[:space:]]+.*/'` if [[ ! -d $f_dir$cmd_lib_dir ]];then mkdir -p $f_dir$cmd_lib_dir && cp $path $f_dir$cmd_lib_dir &> /dev/null else cp $path $f_dir$cmd_lib_dir &> /dev/null fi done echo "backup ${cmd}'s library finished" } main() { while true do cmd_input cp_cmd cp_cmd_lib done } main
select 循環與菜單
select variable in list
do
循環體命令
done
select 循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示 PS3 提示符,等待用戶輸入
用戶輸入菜單列表中的某個數字,執行相應的命令
用戶輸入被保存在內置變量 REPLY 中。
select 是個無限循環,因此要記住用 break 命令退出循環,或用 exit 命令終止腳本。也可以按 ctrl+c退出循環。
select 經常和 case 聯合使用
與 for 循環類似,可以省略 in list , 此時使用位置參量
完
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/38862