私の入力は、コマンドの後に単一の文字オプションが無制限になることですcommand -abc
。
削除オプションたとえば、次のように達成できますb
。c
$ cmd='command -abc'
$ pattern='(.*) -(.*)'
$ [[ $cmd =~ $pattern ]]
$ echo "${BASH_REMATCH[1]} -${BASH_REMATCH[2]//[cb]}"
command -a
しかし、これはbashでのみ機能します。たとえば、sed
およびを使用するなど、互換性のある方法でこの問題をどのように解決できますかgrep
?
ベストアンサー1
コマンドが単一文字オプションのみを取り、オプションが引数を持たないと仮定すると、コマンドラインオプションを解析し、不要なオプションを削除し、新しいオプションセットを指定したコマンドを実行するラッパースクリプトを作成できます。
#!/bin/sh
savedopts=-
printf 'Args in = %s\n' "$*"
while getopts :bc opt; do
case $opt in
b|c) ;; # nothing
*)
savedopts="$savedopts$OPTARG"
esac
done
shift "$(( OPTIND - 1 ))"
set -- "$savedopts" -- "$@"
printf 'Args out = %s\n' "$*"
# Run the command:
some-command "$@"
b
オプションとを無視してコマンドラインを解析し、残りのc
オプションをに入れます$savedopts
。
$savedopts
その後、ラップされたコマンドと元のコマンドラインで指定されたオペランド(で区切り--
)を実行するために使用されます。
getopts
予期しないオプションの解析を要求してもエラーは発生しません。これは、:
最初のパラメータの初期化によるものですgetopts
。
テスト実行:
$ ./script -abcd -b -c -- -bx -a foo bar
Args in = -abcd -b -c -- -bx -a foo bar
Args out = -ad -- -bx -a foo bar
./script: some-command: not found