复制命令的Shell脚本编写示例

来源:互联网 发布:淘宝店铺怎样进行装修 编辑:程序博客网 时间:2024/06/05 21:53

编写脚本/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#------------------------------------------# Filename:copycmd72.sh # Revision:1.0 # Date:2017-09-11 # Author:156# Email:1140994710@qq.com# Description:用于复制命令和他的库文件到/mnt/sysroot/目录下。#------------------------------------------#判断用户输入的命令是不是命令com() {    local var1    man $1 &>/dev/null    var1=$?    if [ $var1 -eq 0 ];then        return 0    else        echo -e "\terror,找不到\e[33m${1}命令\e[0m,您请确认!"        return 1    fi}#判断命令是内部命令还是外部命令encmd() {    local var2=`type $1`    local var3=`echo $var2 | grep -o "builtin"`    if [ -n "$var3" ];then        echo -e "\terror,\e[34m${CMD}是内部命令\e[0m,不可以复制!"        return 1    else        return 0    fi}#判断文件类型的函数filetype() {    file=`ls -l $1 | grep -o "^."`    case $file in            -)            return 0                    ;;            d)            return 1                    ;;            l)            return 2                    ;;        esac}#创建目录的函数createdir() {    local dirnm=`dirname $1`    mkdir -p ${Dir}${dirnm}    targetdir=${Dir}${dirnm}    return 0}#复制文件的函数copy() {    filetype $1    local ft=$?    if [ $ft -eq 0 ];then        createdir $1        cp -pdr $1 $targetdir &> /dev/null        echo -e "\t\t$1\t\c"        echo -e "========>\t\c"        echo -e "\e[31m${targetdir}\e[0m"        return 0    elif [ $ft -eq 2 ];then        createdir $1        cp -pdr $1 $targetdir &> /dev/null        echo -e "\t\t$1\t\c"        echo -e "========>\t\c"        echo -e "\e[31m${targetdir}\e[0m"        lianjiewenjian=$(locate `ls -l $1 | cut -d " " -f 11`)        copy $lianjiewenjian    fi}Dir="/mnt/sysroot"mkdir -p $Dirwhile true;do    read -p "请输入一个您想要复制的命令(quit:退出):" cmd    CMD=`basename $cmd`    if [ "$CMD" == "quit" ];then        exit 1    fi    com $CMD    if [ $? == 0 ];then        encmd $CMD        encmd=$?        if [ $encmd -eq 0 ];then            #因为在脚本里面不可以执行别名所以,不需要varA=`which ls | grep "^[[:space:]]" | grep  -o "/.*"`            varA=`which $CMD`            echo -e "\t\e[5;31m${CMD}命令\e[0m正在复制……"            copy $varA            for A in `for i in $(ldd $varA);do echo $i ;done | grep -o "/.*"` ;do                 copy $A            done            echo -e "\t\e[5;31m${CMD}命令\e[0m复制结束!"        fi    fidone

这里写图片描述

这里写图片描述
小编刚接触linux,水平一般,脚本中的内容也比较冗杂,该博客的目的只是为了给大家一个思路,希望能起到抛砖引玉的效果。