96

次のように実行するように設計されたシェルスクリプトを作成しようとしています:

script.sh -t application

まず、私のスクリプトでは、スクリプトが -t フラグで実行されたかどうかを確認したいと思います。たとえば、このようなフラグなしで実行された場合、エラーが発生するようにします。

script.sh

次に、-t フラグがあると仮定して、値を取得し、スクリプトで使用できる変数に格納します。たとえば、次のようにします。

FLAG="application"

これまでのところ、私がこれまでに達成できた唯一の進歩は、 $@ がすべてのコマンドライン引数を取得することですが、これがフラグにどのように関係しているか、またはこれが可能かどうかさえわかりません。

4

4 に答える 4

149

このgetoptsチュートリアルを読む必要があります。

-a引数を必要とするスイッチの例:

#!/bin/bash

while getopts ":a:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

greybotが言ったように(getopt!= getopts):

外部コマンドgetopt(1)は、 GNU getoptであることがわかっていない限り、GNU固有の方法で呼び出し、GETOPT_COMPATIBLEが環境内にないことを確認しない限り、安全に使用することはできません。代わりにgetopts(シェルビルトイン)を使用するか、単に位置パラメーターをループしてください。

于 2013-01-21T21:24:00.853 に答える
36

引数の数を取得するために使用$#します。2に等しくない場合は、十分な引数が提供されていません。

if [ $# -ne 2 ]; then
   usage;
fi

次に、等しいかどうかを確認します。$1等しく-tない場合は、不明なフラグが使用されました。

if [ "$1" != "-t" ]; then
  usage;
fi

最後に保存$2FLAGます:

FLAG=$2

注:usage()構文を示す関数です。例えば:

function usage {
   cat << EOF
Usage: script.sh -t <application>

Performs some activity
EOF
   exit 1
}
于 2013-01-21T21:24:47.117 に答える
1

shFlags を試してみてください -- Unix シェル スクリプト用の高度なコマンドライン フラグ ライブラリです。

http://code.google.com/p/shflags/

それは非常に優れており、非常に柔軟です。

フラグの種類: これは、実行できる DEFINE_* のリストです。すべてのフラグは、名前、デフォルト値、ヘルプ文字列、およびオプションの「短い」名前 (1 文字の名前) を取ります。一部のフラグには、フラグで説明されている他の引数があります。

DEFINE_string: 任意の入力を受け取り、文字列として解釈します。

DEFINE_boolean: 通常は引数を取りません。FLAGS_myflag を true に設定するには --myflag を指定し、FLAGS_myflag を false に設定するには --nomyflag を指定します。または、 --myflag=true または --myflag=t または --myflag=0 または --myflag=false または --myflag=f または --myflag=1 と言うことができます オプションを渡すことは、オプションは一度。

DEFINE_float: 入力を受け取り、それを浮動小数点数として解釈します。シェルは浮動小数点自体をサポートしていないため、入力は有効な浮動小数点値として検証されるだけです。

DEFINE_integer: 入力を受け取り、それを整数として解釈します。

特別なフラグ: 特別な意味を持つフラグがいくつかあります: --help (または -?) は、人間が読める形式ですべてのフラグのリストを出力します --flagfile=foo foo からフラグを読み取ります。(まだ実装されていません) -- getopt() と同様に、フラグ処理を終了します。

使用例:

-- begin hello.sh --
 ! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --

$ ./hello.sh -n Kate
Hello, Kate.

注: このテキストは shflags のドキュメントから引用しました

于 2017-11-06T18:43:55.940 に答える