opções do script de shell passam pelo subcomando

3

Estou escrevendo um script de wrapper para isso que usa getopts para definir várias opções para mysqldump . Está funcionando bem até agora.

No entanto, uma coisa que eu gostaria de fazer é poder adicionar outra opção no meu shell script, cujo conteúdo deve ser passado para o comando mysqldump exatamente. Mais ou menos como uma opção de opções como esta:
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
com o conteúdo da string do argumento -o passado exatamente para o comando mysqldump .

Como estou usando getopts ao tentar o acima, recebo a seguinte saída:
Invalid option: --

Alguém sabe como lidar com isso?
Existe uma maneira de escapar da entrada de opções para que getopts não analise o conteúdo como outra opção?

Então, quando se trata de disparar o comando real do meu shell script, é isso que eu tenho:
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
Como pode haver espaços na variável OPTIONSPASSTHROUGH, citei essa variável nesse comando. Isso está correto?

    
por batfastad 31.05.2013 / 12:53

2 respostas

3

Se você especificar que -- marca o fim das opções e todos os argumentos a seguir serão passados para o subcomando, você pode fazer algo como você pode encontrar em 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$*"

Especificamente, estou me referindo ao fim - getopts pára as opções de processamento quando encontra -- , então todos esses argumentos permanecerão em $@ . No exemplo acima, todos os argumentos getopts processados estão com shift ed e os restantes são impressos todos de uma vez como $* . Se você manuseá-lo da mesma forma, poderá fazer o seguinte trabalho:

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

E para chamar o aplicativo empacotado:

mysqldump "$@" \
    --host=$MYSQL_HOST \
    --user=$MYSQL_USER \
    --password=$MYSQL_PASS "$DB" \
> "$FILE_DEST"
    
por 18.06.2014 / 13:10
0

Uma alternativa seria:

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

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

Como regra geral: Você deve citar tudo (que pode ser citado).

    
por 31.05.2013 / 13:14