私はbashスクリプトのパラメータを解析するためにgetoptsを使います。
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
未解決のオプション/引数はすべて保存されます。 exeparamsを使用してスクリプト内で実行されるコマンドのオプション(スクリプト自体のオプションと重複する可能性があります)を保存したいので、--を使用してスクリプトに渡されたオプションを終了したいと思います。たとえば、渡すと
myscript -d myscriptparam -- -d internalparam
exeparams
開催されます
-- -d internalparam
--
これで、これらのパラメータを内部コマンドに渡すために先行部分を削除したいと思います。これを行うエレガントな方法はありますか?それとも、--
getoptsから取得せずに残りのみを含む文字列を取得できますか?
ベストアンサー1
組み込みshift
。getopts
ループが完了すると、
shift "$((OPTIND - 1))"
処理されたすべてのオプションが削除されます。
ここで、--
スクリプトの最初の部分(以前)の非オプション引数(存在する場合)の処理を完了する必要があります。いったん向き合うと、--
後部(-d internalparam
後部--
)だけが残るまで外に引き出します。一方向(bash
構文を使用):
while [[ $# -gt 0 ]]; do
# process next argument
case $1 in
foo) # process foo
;;
--) shift; break;; # found '--', discard it and exit loop
*) # handle unrecognized argument
;;
esac
# not '--', so discard the argument and continue
shift
done
最後に、渡すことができる2番目のオプション/パラメータセットのみが残ります。するいいえ$*
残りのパラメータを他のコマンドに渡すために使用されます。置換を使用すると、"$@"
元の単語分割が維持されます。
external_command "$@"