0

2 つの引数 (ファイル名と MD5hashval) を期待するスクリプトを取得しました。md5sum test.sh | を使用して、MD5sum の 16 進出力だけを抽出できます。grep -om1 '^[0-9a-f]*.' 何らかの理由で、同じコマンドをスクリプトから呼び出すと失敗します。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 に答える