2

我正在创建一个脚本来复制文件或目录,并在其名称上附加日期,例如,如果文件名testtest-20130901.bkup

这是我的脚本

#!/usr/bin/bash
set -x

getopts fd TYPE
[ $TYPE = "d" ] && alias cp="cp -r"

backup_error() {
        echo "${0##*/}: $1"
        exit -1
}

typeset -r FROM_DIR=$2 TO_DIR=$3
if [ ! -e $FROM_DIR -a ! -d $FROM_DIR ] || [ ! -e $TO_DIR -a ! -d $TO_DIR ]
then
        backup_error "One of the directories isn't exist or it maybe a file";
fi

typeset -r DATE=$(date "+%Y%m%d")
for filename in $FROM_DIR/*
do
        if [ -$TYPE $filename ]
        then
                cp $filename $TO_DIR/${filename##*/}-$DATE.bkup
        fi
done

unalias cp

在脚本中,我检查用户是否只想在文件或目录上运行脚本。 -f仅用于文件 仅 -d用于目录

[ $TYPE = "d" ] && alias cp="cp -r",这一行来检查脚本是否为我必须使用的目录运行,所以我为要cp -r创建一个别名cpcp -r

但是当我set -x用来调试时,我发现当用户使用-d选项时,cp命令if仍然是原始命令而不是别名。

调试:

> ./backup.sh -d . .
+ getopts fdb TYPE
+ '[' d = d ']'
+ alias 'cp=cp -r'
+ typeset -r FROM_DIR=. TO_DIR=.
+ '[' '!' -e . -a '!' -d . ']'
+ '[' '!' -e . -a '!' -d . ']'
++ date +%Y%m%d
+ typeset -r DATE=20130901
+ '[' -d ./backup.sh ']'
+ '[' -d ./dir1 ']'
+ cp ./dir1 ./dir1-20130901.bkup
cp: ./dir1: is a directory
+ '[' -d ./file1 ']'
+ '[' -d ./file2 ']'
+ '[' -d ./test.sh ']'
+ unalias cp
4

1 回答 1

2

改用函数:

if [[ $TYPE == d ]]; then
    function cp {
        command cp -r "$@"
    }
fi

在 Bash 中,[[ ]]建议使用testor [ ]

还要引用请在之间正确引用您的变量,""以防止分词和意外的路径名扩展。

其他注意事项:

    exit -1  ## exit can only accept 8-bit integral values from 0 to 255. -1 here is orthodox and is equivalent to 255.

您应该在此处引用变量或使用[[ ]]

    if [[ ! -e $FROM_DIR && ! -d $FROM_DIR ]] || [[ ! -e $TO_DIR && ! -d $TO_DIR ]]

    if [ "-$TYPE" "$filename" ]  ## for custom operators, test is better: test "-$TYPE" "$filename"

            cp "$filename" "$TO_DIR/${filename##*/}-$DATE.bkup"

for filename in "$FROM_DIR"/*

最后确保你运行你的脚本:

bash script.sh -f from_dir to_dir
# Or
bash script.sh -d from_dir to_dir
于 2013-09-01T15:39:00.543 回答