如何解决Bash脚本来计算和比较校验和
我正在编写一个小的bashscript来计算文件的校验和,并将其与给定文件进行比较。
#!/bin/bash
usage() { echo "Usage: $0 [-f <file>] [-h <hash>] [-m <md5|sha256|...>]" 1>&2; exit 1; }
if [ $# -eq 0 ]
then
echo "No arguments supplied!"
usage
fi
while getopts ":h:m:f:" opt; do
case "${opt}" in
h )
sum=${OPTARG}
;;
m )
method=${OPTARG}
;;
f )
file=${OPTARG}
;;
: )
usage
;;
\? )
usage
;;
esac
done
shift $((OPTIND-1))
method="${method}sum"
echo "${sum} ${file}" | ${method} -c
该脚本可以正常工作-当然,只要参数有意义即可。
但是,如果我输入类似./checksum.sh -fm
的内容,那么应该有一个'?'在 opt 中,因为缺少参数,因此不执行相应的情况并且脚本不会退出。
由于$ method为空,错误消息为
invalid option -- 'c'
Try 'sum --help' for more information.
为什么这行不通,我该如何解决?
解决方法
您的帖子标题具有误导性,因为您在此处讨论的问题仅与 getopts 的正确用法有关,而与您随后对参数的处理无关。
您已将选项定义为需要一个参数。例如,将脚本调用为
./checksum.sh -fxxxx
等同于
./checksum.sh -f xxxx
,表示file
设置为 xxxx 。如果您将其调用为
./checksum.sh -fm
这意味着file
设置为 m ,而method
保持为空。
getopt
没有强制性选项。如果某些选项是必需的,则必须在使用它们之前检查相应的变量:
declare method=""
while getopts ":h:m:f:" opt; do
...
done
if [ -z "$method" ]; then
usage
fi
如果您有一个选项的默认值,只需在解析选项之前对其进行初始化:
declare method="sha256"
while getopts ":h:m:f:" opt; do
...
done
if [ -z "$method" ]; then
usage
fi
这样,即使相应选项未修改其值,它也将通过后期测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。