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