我正在创建一个脚本来复制文件或目录,并在其名称上附加日期,例如,如果文件名test
是test-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
创建一个别名cp
cp -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