명령에서 옵션 제거

명령에서 옵션 제거

내 입력은 명령 다음에 단일 문자 옵션이 무제한으로 나오는 것입니다(예: 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

관련 정보