编写服务脚本/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.178linux.com/38862