首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S3工具第3部分

S3工具第3部分
EN

Code Review用户
提问于 2018-01-13 22:40:48
回答 1查看 45关注 0票数 2

以下是前一个问题的后续内容:

第3部分:用户脚本

我在这里提交的所有代码都可以在github中获得

编写这些工具的原因是为了能够在C++中实现这些工具之前,对它们进行原型化并快速验证是否正确。这主要是必要的,因为这些脚本所基于的文档是相对糟糕和混乱的。

用户使用的脚本:

s3cp

代码语言:javascript
复制
#!/usr/bin/env bash

badflag=0
declare -a ARGS

function usage {
    echo "Usage:"
    echo "s3cp    [--key=] [--secret=] [--verbose] [--dryrun]"
    echo "s3cp    [--key=] [--secret=] [--verbose] [--dryrun]"
    echo
    echo "s3-url:  s3:///"
    exit 1
}

verbose=''
dryrun=0
access=${AMZ_ACCESS_KEY}
secret=${AMZ_SECRET_KEY}
for var in "$@"; do
    if [[ "${var}" == '--verbose' ]]; then
        verbose='/dev/stdout'
        continue
    fi
    if [[ "${var}" == '--dryrun' ]]; then
        dryrun=1
        continue;
    fi
    if [[ "${var%=*}" == "--key" ]]; then
        access=${var#*=}
        continue;
    fi
    if [[ "${var%=*}" == "--secret" ]]; then
        secret=${var#*=}
        continue;
    fi
    flag=${var#-}
    if [[ "${flag}" != ${var} ]]; then
        badflag=1
        echo "Bad flag: ${var}"
        continue
    fi
    ARGS+=("$var")
done

if [[ "${access}" == "" || "${secret}" == "" ]]; then
    echo "Error: No Access or Secret provided."
    echo "These can be set in the environment variables AMZ_ACCESS_KEY/AMZ_SECRET_KEY or passed with flags"
    usage
fi

if [[ ${#ARGS[@]} != 2 || ${badflag} != 0 ]]; then
    usage
fi

src=${ARGS[0]}
dst=${ARGS[1]}

doUpload=0
doDownload=0
srcS3=${src#s3://}
if [[ "${src}" == "${srcS3}" ]]; then
    doUpload=1
fi
dstS3=${dst#s3://}
if [[ "${dst}" == "${dstS3}" ]]; then
    doDownload=1
fi

if [[ ${doUpload} == 0 && ${doDownload} == 0 ]]; then
    echo "Neither source or destination is on S3. Just use normal cp"
    usage
fi
if [[ ${doUpload} == 1 && ${doDownload} == 1 ]]; then
    echo "Both source or destination is on S3. Don't support move yet."
    usage
fi

dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source ${dir}/s3/signature


if [[ ${doUpload} == 1 ]]; then
    source ${dir}/s3/upload
    upload "${src}" "${dst}" "${access}" "${secret}" '' "${verbose}" "${dryrun}"
else
    source ${dir}/s3/download
    download "${src}" "${dst}" "${access}" "${secret}" '' "${verbose}" "${dryrun}"
fi
EN

回答 1

Code Review用户

发布于 2018-01-16 18:05:06

如果出现错误/警告,请将输出写入stderr,而不仅仅是将输出写入stdout流。这还可能包括返回usage部分。

有一个连锁的if块是海事组织,总是非常糟糕。您可以在那里使用一个switch-case块,并继续使用shift参数。一个简单的例子是:

代码语言:javascript
复制
ARGS=()
while [[ $# -gt 0 ]]
do
    key="$1"

    case $key in
      -v|--verbose)
        verbose='/dev/stdout'
        shift # past argument
        ;;
      --dryrun)
        dryrun=1
        shift # past argument
        ;;
      -k=*|--key=*)
        access="${key#*=}"
        shift # past argument
        shift # past value
        ;;
      -k|--key)
        shift # past argument
        access="$1"
        shift # past value
        ;;
      .
      .
      .
      *)    # unknown option
        if [[ "${key#-}" != ${key} ]]; then
            badflag=1
            >&2 echo "Bad flag: ${var}"
        fi
        ARGS+=("$1") # save it in an array for later
        shift # past argument
        ;;
    esac
done

注意,您可以很容易地维护--key=KEY--key KEY格式参数。除此之外,以后在实用程序中添加另一个新参数是非常容易的。

继续在UPPER_CASE中定义全局值,以便以后在不断扩展的代码中很容易区分它们。

这些可以在环境变量AMZ_ACCESS_KEY/AMZ_SECRET_KEY中设置,也可以用标志传递。

AWS建议使用名为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY的环境变量。如果你不尊重违约,我会认为这违反了常规。

定义使用内容(或手册页?)作为特约医生:

代码语言:javascript
复制
USAGE=<  [--key=] [--secret=] [--verbose] [--dryrun]
s3cp    [--key=] [--secret=] [--verbose] [--dryrun]

s3-url:  s3:///

EOF
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/185068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档