以下是前一个问题的后续内容:
第3部分:用户脚本
我在这里提交的所有代码都可以在github中获得
编写这些工具的原因是为了能够在C++中实现这些工具之前,对它们进行原型化并快速验证是否正确。这主要是必要的,因为这些脚本所基于的文档是相对糟糕和混乱的。
用户使用的脚本:
#!/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发布于 2018-01-16 18:05:06
如果出现错误/警告,请将输出写入stderr,而不仅仅是将输出写入stdout流。这还可能包括返回usage部分。
有一个连锁的if块是海事组织,总是非常糟糕。您可以在那里使用一个switch-case块,并继续使用shift参数。一个简单的例子是:
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_ID和AWS_SECRET_ACCESS_KEY的环境变量。如果你不尊重违约,我会认为这违反了常规。
定义使用内容(或手册页?)作为特约医生:
USAGE=< [--key=] [--secret=] [--verbose] [--dryrun]
s3cp [--key=] [--secret=] [--verbose] [--dryrun]
s3-url: s3:///
EOFhttps://codereview.stackexchange.com/questions/185068
复制相似问题