コマンドからオプションを削除

コマンドからオプションを削除

私の入力は、コマンドの後に単一の文字オプションが無制限になることですcommand -abc

削除オプションたとえば、次のように達成できますbc

$ 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

おすすめ記事