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 @R_729_4045@ion.

为什么这行不通,我该如何解决

解决方法

您的帖子标题具有误导性,因为您在此处讨论的问题仅与 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

这样,即使相应选项未修改其值,它也将通过后期测试。