shFlags を試してみてください -- Unix シェル スクリプト用の高度なコマンドライン フラグ ライブラリです。
http://code.google.com/p/shflags/
それは非常に優れており、非常に柔軟です。
フラグの種類:これは、実行できる DEFINE_* のリストです。すべてのフラグは、名前、デフォルト値、ヘルプ文字列、およびオプションの「短い」名前 (1 文字の名前) を取ります。一部のフラグには他の引数があり、フラグで説明されています。
DEFINE_string:任意の入力を受け取り、それを文字列として解釈します。
DEFINE_boolean:通常は引数を取りません:--myflag と指定して FLAGS_myflag を true に設定するか、--nomyflag と指定して FLAGS_myflag を false に設定します。あるいは、--myflag=true または --myflag=t または --myflag=0 と指定することもできます。または --myflag=false または --myflag=f または --myflag=1 オプションを渡すと、オプションを 1 回渡すのと同じ効果があります。
DEFINE_float:入力を受け取り、それを浮動小数点数として解釈します。 Asshell は float 自体をサポートしていません。入力は有効な浮動小数点値として検証されるだけです。
DEFINE_integer:入力を受け取り、それを整数として解釈します。
特別なフラグ:特別な意味を持つフラグがいくつかあります:--help (または -?) は、人間が読める形式ですべてのフラグのリストを出力します --flagfile=foo foo からフラグを読み取ります。 (まだ実装されていません)-- getopt() と同様に、フラグ処理を終了します
使用例:
-- begin hello.sh --
! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --
$ ./hello.sh -n Kate
Hello, Kate.
注:このテキストは shflags のドキュメントから引用しました
これは、すべてのスクリプトの先頭に貼り付けることができる、一般化された単純なコマンド引数インターフェイスです。
#!/bin/bash
declare -A flags
declare -A booleans
args=()
while [ "$1" ];
do
arg=$1
if [ "${1:0:1}" == "-" ]
then
shift
rev=$(echo "$arg" | rev)
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
then
bool=$(echo ${arg:1} | sed s/://g)
booleans[$bool]=true
echo \"$bool\" is boolean
else
value=$1
flags[${arg:1}]=$value
shift
echo \"$arg\" is flag with value \"$value\"
fi
else
args+=("$arg")
shift
echo \"$arg\" is an arg
fi
done
echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"
コマンドを実行:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
出力は次のようになります:
"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean
booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg
Boolean types:
Precedes Flag(pf): true
Final Arg(f): true
Colon Terminated(Ct): true
Not Mentioned(nm):
Flag: myFlag => my flag value
Args: one => firstArg, two => secondArg, three => thirdArg
基本的に、引数はフラグ ブール値とジェネリック引数に分割されます。このようにすることで、ユーザーは、ジェネリック引数 (存在する場合) を指定された順序で保持している限り、フラグとブール値をどこにでも配置できます。
私とあなたが bash 引数の解析に二度と対処しないようにします!
ここで更新されたスクリプトを表示できます
これは昨年、非常に役に立ちました。変数の前にスコープ パラメーターを付けることで、スコープをシミュレートできるようになりました。
次のようにスクリプトを呼び出すだけです
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
引数のスコープを実装したようには見えませんが、まだ必要ではない理由がわかりません.
$#
を使用 引数の数を取得します。2 に等しくない場合は、十分な引数が提供されていません:
if [ $# -ne 2 ]; then
usage;
fi
次に、$1
かどうかを確認します -t
に等しい 、それ以外の場合は不明なフラグが使用されました:
if [ "$1" != "-t" ]; then
usage;
fi
最後に $2
を保存します FLAG
で :
FLAG=$2
注:usage()
構文を示す関数です。例:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
この 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
グレイボットが言ったように(getopt
!=getopts
) :
知らない場合を除き、外部コマンド getopt(1) を安全に使用することはできません。 それは GNU getopt であり、GNU 固有の方法で呼び出し、および GETOPT_COMPATIBLE が環境にないことを確認します。代わりに getopts (shellbuiltin) を使用するか、単純に位置パラメータをループしてください。