0

我有一个需要两个参数(文件名和 MD5hashval)的脚本。我可以使用 md5sum test.sh 提取 MD5sum 的十六进制输出 | grep -om1 '^[0-9a-f]*.' 出于某种原因,从脚本调用相同的 cmd 时会失败。检查传递给 Bash 脚本的命令行参数的最佳方法是什么?代码如下所示:

#!/bin/bash

while getopts ":f:s" opt; do
  case $opt in
    f)

      FILENAME=`echo $OPTARG | sed 's/[-a-zA-Z0-9]*=//'`
      echo ${FILENAME}
      ;;
    s)

       MD5SUM=`echo $OPTARG | grep -om1 '^[0-9a-f]*'` 
       echo $MD5SUM
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done
4

2 回答 2

2

由于该s选项需要一个参数,因此您需要在其后放置一个冒号。它应该是:

while getopts "f:s:" opt; do
...

getopts手册页:

如果一个字符后跟一个冒号,则该选项应该有一个参数,该参数应该用空格与它分开。

于 2013-02-15T09:27:06.817 回答
0

我的第一个动作是在您的实际命令之前放置一个调试行:

echo "[$OPTARG]"
MD5SUM=`echo $OPTARG | grep -om1 '^[0-9a-f]*'`

但它实际上与选项字符串s中没有后跟冒号的事实有关。getopts您应该f:s:改用:

... optstring 包含要识别的选项字符;如果一个字符后跟一个冒号,则该选项应该有一个参数,该参数应该用空格与它分开。

而且,顺便说一句,我认为您的错误行应该是-$opt而不是-$OPTARG.

于 2013-02-15T09:20:04.540 回答