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

编写脚本/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:[email protected]
# 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 $Dir
while 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
    fi
done

复制命令的Shell脚本编写示例_第1张图片

复制命令的Shell脚本编写示例_第2张图片
小编刚接触linux,水平一般,脚本中的内容也比较冗杂,该博客的目的只是为了给大家一个思路,希望能起到抛砖引玉的效果。

你可能感兴趣的:(运维)