微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

变量作为bash脚本中的命令

我正在编写一个非常简单的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"

原文地址:https://www.jb51.cc/bash/386474.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐