使用grep / sed解析BASH命令行参数

时间:2013-02-15 09:16:14

标签: bash grep

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

#!/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

2 个答案:

答案 0 :(得分:3)

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

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

来自getopts手册页:

  

如果一个字符后跟一个冒号,则该选项是预期的   有一个参数,应该用空格分隔。

答案 1 :(得分:0)

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

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

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

  

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

另外,我认为您的错误行应该是-$opt而不是-$OPTARG