我正在编写一个非常简单的bash脚本,它可以对给定的目录进行加密,加密其输出,然后将生成的文件分解成多个较小的文件,因为备份介质不支持巨大的文件.
我没有很多bash脚本的经验.我相信我有正确引用我的变量的问题,以允许参数中的空格.脚本如下:
#! /bin/bash # This script tars the given directory,encrypts it,and transfers # it to the given directory (likely a USB key). if [ $# -ne 2 ] then echo "Usage: `basename $0` DIRECTORY BACKUP_DIRECTORY" exit 1 fi DIRECTORY=$1 BACKUP_DIRECTORY=$2 BACKUP_FILE="$BACKUP_DIRECTORY/`date +%Y-%m-%dT%H-%M-%S.backup`" TAR_CMD="tar cv $DIRECTORY" SPLIT_CMD="split -b 1024m - \"$BACKUP_FILE\"" ENCRYPT_CMD='openssl des3 -salt' echo "$TAR_CMD | $ENCRYPT_CMD | $SPLIT_CMD" $TAR_CMD | $ENCRYPT_CMD | $SPLIT_CMD say "Done backing up"
运行此命令失败:
split: “foo/2009-04-27T14-32-04.backup”aa: No such file or directory
我可以通过删除$BACKUP_FILE周围的引号来修复它,其中我设置$SPLIT_CMD.但是,如果我的备份目录的名称空间不起作用.另外,如果我将“echo”命令的输出直接复制并粘贴到终端,那么工作正常.显然,我不了解Bash如何逃避事情.
简单的说,不要把整个命令放在变量中.尝试恢复引用的参数时会遇到很多麻烦.
也:
>避免在脚本中使用全资本变量名.轻松的方式来拍摄自己的脚.
>不要使用反引号,使用$(…)代替,它更好地嵌套.
#! /bin/bash if [ $# -ne 2 ] then echo "Usage: $(basename $0) DIRECTORY BACKUP_DIRECTORY" exit 1 fi directory=$1 backup_directory=$2 current_date=$(date +%Y-%m-%dT%H-%M-%S) backup_file="${backup_directory}/${current_date}.backup" tar cv "$directory" | openssl des3 -salt | split -b 1024m - "$backup_file"