我正在创建一个脚本,用于复制附有其名称的日期的文件或目录,例如,如果文件名为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
命令仍然是原始的而不是别名。< / p>
调试:
> ./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
答案 0 :(得分:2)
改为使用函数:
if [[ $TYPE == d ]]; then
function cp {
command cp -r "$@"
}
fi
在Bash中,[[ ]]
推荐test
或[ ]
。
同时引用请在""
之间正确引用您的变量,以防止分词和意外的路径名扩展。
其他警告:
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