-x
と--xxxx
を引数ではなくスイッチとして認識する組み込みツールはありますか、またはすべての入力変数を調べてダッシュをテストし、その後引数を解析する必要がありますか? ?
getopts
を使用します。
POSIX仕様と同様に、かなり移植性があります。残念ながら、これは長いオプションをサポートしていません。
こちらもご覧くださいgetopts
tutorial bash-hackers wikiのご厚意により、こちら question からStackoverflowへ。
短いオプションだけが必要な場合、getopts
の一般的な使用パターン(非サイレントエラーレポートを使用)は次のとおりです。
# process arguments "$1", "$2", ... (i.e. "$@")
while getopts "ab:" opt; do
case $opt in
a) aflag=true ;; # Handle -a
b) barg=$OPTARG ;; # Handle -b argument
\?) ;; # Handle error: unknown option or missing required argument.
esac
done
私はあなたがbashまたは類似のものを使用していると思います。例:
all=false
long=false
while getopts ":hal" option; do
case $option in
h) echo "usage: $0 [-h] [-a] [-l] file ..."; exit ;;
a) all=true ;;
l) long=true ;;
?) echo "error: option -$OPTARG is not implemented"; exit ;;
esac
done
# remove the options from the positional parameters
shift $(( OPTIND - 1 ))
ls_opts=()
$all && ls_opts+=( -a )
$long && ls_opts+=( -l )
# now, do it
ls "${ls_opts[@]}" "$@"
パラメータを解析するには、サイクルを記述する必要があります。実際、getopts
コマンドを使用して簡単に実行できます。
これはgetopts
マニュアルページの簡単な例です:
aflag=
bflag=
while getopts ab: name
do
case $name in
a) aflag=1;;
b) bflag=1
bval="$OPTARG";;
?) printf "Usage: %s: [-a] [-b value] args\n" $0
exit 2;;
esac
done
if [ ! -z "$aflag" ]; then
printf "Option -a specified\n"
fi
if [ ! -z "$bflag" ]; then
printf 'Option -b "%s" specified\n' "$bval"
fi
shift $(($OPTIND - 1))
printf "Remaining arguments are: %s\n" "$*"
汎用性があり、複数の種類のスイッチを任意の順序で許可する作業のために、最近スクリプトを作成しました。明らかな法的な理由で完全なスクリプトを開示することはできません(言うまでもありませんが、現時点では持っていません)。これがその要点です。サブルーチンに入れて、最後に呼び出すことができます。あなたのスクリプトの:
options () {
if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
while (( "$#" )); do # process ALL arguments
if [ "$1" = ^-t$ ]; then # -t short for "test"
# do something here THEN shift the argument
# shift removes it from $@ and reduces $# by
# one if you supply no argument
shift
# we can also process multiple arguments at once
Elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
# do something more then remove them ALL from the arg list
shift 3
else
echo "No matching arguments!"
echo "Usage: [script options list here]"
fi
done
else
echo "Usage: [script options list here]"
exit 0
fi
}
options "$@" # run options and loop through/process ALL arguments
Bashスクリプトを400行/ 15,000文字未満に制限することをお勧めします。私の前述のスクリプトはこのサイズを超えて大きくなり、作業が非常に困難になりました。私はそれをPerlで書き直し始めましたが、これはタスクにはるかに適しています。 bashでスクリプトを作成するときは、このことを覚えておいてください。 Bashは小さなスクリプトやワンライナーには最適ですが、もっと複雑なものはPerlで作成した方がよいでしょう。
上記のテストは行っていないので、おそらく機能しないことに注意してください。