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}"
일반적으로, 인용할 수 있는 모든 항목을 인용해야 합니다.