getoptまたはoptparseを使用してオプションを設定すると、1つのダッシュが1文字に対応することがわかります。しかし、とにかく複数の文字に単一のダッシュを使用できますか-apply
?
ダッシュは短い名前を表し、一般に人々はこれを表すために1つの文字を使用することを知っています。ただし、一部のコマンド(たとえばfind -printf
)は、単一のダッシュを含む長い名前を使用します。
Linuxのbashでダッシュで長い名前を使用する方法を知っている人はいますか(getopt
またはoptparse
他のbashツールを使用して)?
答え1
答え2
GNUシステムがあり、単一のダッシュロングオプションが必要な場合は、必ずまたはgetopt_long
を使用してくださいgetopt -a
。
この例はfind -printf
GNU 拡張に私の関心を集めました。find
ワンダッシュオプションはGNUシステムの外に存在し、その遺産はおそらくGNUスタイルの長いオプションよりもはるかに古いでしょう。したがって、このようなプログラムは をfind
使用せずにgetopt_long
コマンドラインオプションを手動で解析できます。 Bashでは、次のように見えます。
$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do
if [ "$1" = "-foo" ] ; then
foo=1
elif [ "$1" = "-bar" ] ; then
shift
bar=$1
fi
shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x
答え3
単一文字オプションを解析する際の難点は、バンドルで囲むことができることです(例:-ab
と同じ-a -b
)。 GNU スタイルの長いオプションの 1 つの難しさは、引数が連結されていても連結されていなくてもよいことです。単一ダッシュマルチ文字オプションを使用すると、解析に問題がなく、手動で簡単に実行できます。
単一ダッシュマルチ文字オプションを持つほとんどのプログラムは、個別のコマンドライン引数として引数を受け入れます。
foo=
bar=default
require_argument () {
if [ $# -eq 2 ]; then
echo >&2 "$0: Option $1 requires an argument"
exit 2
fi
eval "$1=\"\$3\""
}
while case "$1" in
--) shift; false;;
-foo) foo=1
-bar) require_argument bar "$@"; shift;;
-?*) echo >&2 "$0: Unknown option $1"; exit 2;;
*) false;;
esac
do
shift
done
GNUスタイルの長いオプションを試してください。彼らの行動はより標準化され、より多くの人々がこれに慣れてきました。