하위 명령에 전달된 쉘 스크립트 옵션

하위 명령에 전달된 쉘 스크립트 옵션

getopts설정을 위한 래퍼 스크립트를 작성 중입니다 mysqldump. 지금까지는 잘 작동하고 있습니다.

그러나 제가 하고 싶은 한 가지는 내용이 mysqldump 명령에 정확하게 전달되어야 하는 다른 옵션을 쉘 스크립트에 추가하는 것입니다. 다음과 같은 옵션을 전달하는 것과 같습니다.
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
-o 인수의 문자열 내용을 명령에 정확하게 전달합니다 mysqldump.

왜냐하면 위의 내용을 시도하면 getopts다음과 같은 결과가 나오기 때문입니다.
Invalid option: --

이 문제를 해결하는 방법을 아는 사람이 있나요? 콘텐츠가 다른 옵션으로 구문 분석되지 않도록
옵션 입력을 이스케이프하는 방법이 있습니까 ?getopts

그런 다음 쉘 스크립트에서 실제 명령을 트리거할 때 다음과 같은 결과를 얻습니다.
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
OPTIONSPASSTHROUGH 변수에 공백이 있을 가능성이 높으므로 명령에서 해당 변수를 인용했습니다. 그렇죠?

답변1

--표시 끝 옵션을 지정하고 다음 인수가 모두 하위 명령에 전달되는 경우 다음과 같이 수행할 수 있습니다 man getopts.

       aflag=
       bflag=
       while getopts ab: name
       do
           case $name in
           a)    aflag=1;;
           b)    bflag=1
                 bval="$OPTARG";;
           ?)   printf "Usage: %s: [-a] [-b value] args\n" $0
                 exit 2;;
           esac
       done
       if [ ! -z "$aflag" ]; then
           printf "Option -a specified\n"
       fi
       if [ ! -z "$bflag" ]; then
           printf 'Option -b "%s" specified\n' "$bval"
       fi
       shift $(($OPTIND - 1))
       printf "Remaining arguments are: %s\n$*"

getopts구체적으로 말하면, 처리 옵션이 발생하면 바로 종료되는 것을 의미하므로 --해당 매개변수는 모두 그대로 유지됩니다 $@. 위의 예에서는 getopts처리된 매개변수가 모두 shift제거되고 나머지 매개변수는 즉시 인쇄됩니다 $*. 비슷하게 처리하면 다음을 수행할 수 있습니다.

/mysqldumpwrapper.sh \
    -u username \
    -p password \
    -h localhost \
    -- \
    -now --all of these --are passed through

그리고 래핑된 애플리케이션을 호출합니다.

mysqldump "$@" \
    --host=$MYSQL_HOST \
    --user=$MYSQL_USER \
    --password=$MYSQL_PASS "$DB" \
> "$FILE_DEST"

답변2

한 가지 해결 방법은 다음과 같습니다.

... -o "x--no-create-db --replace"

# in the script:
option="${option#x}"

일반적으로, 인용할 수 있는 모든 항목을 인용해야 합니다.

관련 정보