Discussion:
[shell-script] Script com tratamento de parâmetros
Tiago Tarifa tiagotarifa@gmail.com [shell-script]
2016-10-20 17:42:26 UTC
Permalink
Pessoal,

Eu fiz um script e gostaria de tratar os parâmetros passados antes mesmo de
executar a função de cada um deles. Vou explicar melhor abaixo:

O script chama-se restaura.sh e tem os seguintes parâmetros:

"Estrutura: restaura.sh [opções] <arquivoDeConfiguração> [lista-pacotes.txt]

OPÇÕES:
-c, --conf Restaura o sistema baseado no arquivo
Confs<dataDoBackup>.tar.bz2
opcionalmente gera a lista de pacotes.Ex.:
dj-restaura.sh -c arquivo-confs.tar.bz2
lista-pacotes.txt
-s, --sistema Restaura o sistema através do arquivo
Sistema<dataDoBackup>.tar.bz2
-u, --desfazer Volta o backup feito da ultima alteração do sistema.
-f, --force Não faz perguntas.

-h, --help Mostra esta ajuda e sai.
-V, --version Mostra a versão e sai."

O que não pode acontecer:
-c ou --conf se chamado 2 ou mais vezes, tipo:
$ restaura.sh -cf --conf ....

Também não pode chamar o (-u|--desfazer) com o (-c|--conf) e/ou com
(-s|--sistema)
$ restaura.sh -s arquivo -u -c arquivo2 arquivo_lista

Eu tentei usar expressões regulares com o grep de várias formas. A que
melhor cheguei foi esta:
$ grep -Eo -- '-[[:alpha:]]*(h|c)|--(conf|desfazer)' <<<$@ | wc -l

Também tentei com a opção -c do grep, mas parece que ele conta apenas
quantas linhas casou com a ER e não quantas vezes a ER casou com a linha.

Alguém tem uma dica, exemplo ou até mesmo link de algum padrão que já é
seguido?
itamarnet@yahoo.com.br [shell-script]
2016-10-20 18:15:32 UTC
Permalink
Caro Tiago

O que eu posso sugerir é usar flags com o uso do while ou for.


Participo junto com o Aurelio Jargas do projeto FuncoesZZ ( http://funcoeszz.net http://funcoeszz.net/ ) e costumamos fazer isso em muitas das funções lá.
por exemplo:
# Opções de linha de comando
while test "${1#-}" != "$1"
do
case "$1" in
-l | --left ) shift; left=1;;
-r | --right ) shift; right=1;;
-t | --top ) shift; top=1;;
-b | --bottom ) shift; bottom=1;;
-H | --horizontal) shift; left=1; right=1;;
-V | --vertical ) shift; top=1; bottom=1;;
--*) zztool erro "Opção inválida $1"; return 1;;
*) break;;
esac
done
Esse trecho faz parte da zztrim ( https://github.com/funcoeszz/funcoeszz/blob/master/zz/zztrim.sh https://github.com/funcoeszz/funcoeszz/blob/master/zz/zztrim.sh ) e acho que atende na idéia o que vc deseja


Em trechos posteriores as flags são tratadas e determinam o fluxo do processo.


Várias outras funções tratam assim os argumentos, é só consultar o modo operante pelo github da FuncoesZZ ( https://github.com/funcoeszz/funcoeszz/tree/master/zz https://github.com/funcoeszz/funcoeszz/tree/master/zz )


Espero que ajude.


[]'s
Itamar
Tiago Tarifa tiagotarifa@gmail.com [shell-script]
2016-10-20 18:42:25 UTC
Permalink
Boa Itamar, havia me esquecido do uso de flags!

Não tinha pensado em por o while dentro de uma função e usar as variáveis
com o "local" para declarar as flags. Acho que as vezes eu foco no
complicado e esqueço o óbvio.

Muito obrigado!

E parabéns pelo FuncoesZZ. Só de olhar já gostei da forma como foi feita a
indentação, acho que vou começar a fazer igual.

Abs
Post by ***@yahoo.com.br [shell-script]
Caro Tiago
O que eu posso sugerir é usar flags com o uso do while ou for.
Participo junto com o Aurelio Jargas do projeto FuncoesZZ (
http://funcoeszz.net ) e costumamos fazer isso em muitas das funções lá.
# Opções de linha de comando
while test "${1#-}" != "$1"
do
case "$1" in
-l | --left ) shift; left=1;;
-r | --right ) shift; right=1;;
-t | --top ) shift; top=1;;
-b | --bottom ) shift; bottom=1;;
-H | --horizontal) shift; left=1; right=1;;
-V | --vertical ) shift; top=1; bottom=1;;
--*) zztool erro "Opção inválida $1"; return 1;;
*) break;;
esac
done
Esse trecho faz parte da zztrim ( https://github.com/funcoeszz/
funcoeszz/blob/master/zz/zztrim.sh ) e acho que atende na idéia o que vc
deseja
Em trechos posteriores as flags são tratadas e determinam o fluxo do processo.
Várias outras funções tratam assim os argumentos, é só consultar o modo
operante pelo github da FuncoesZZ ( https://github.com/
funcoeszz/funcoeszz/tree/master/zz )
Espero que ajude.
[]'s
Itamar
Sidney Souza king.sidney@yahoo.com.br [shell-script]
2016-10-20 19:20:00 UTC
Permalink
http://tuxtweaks.com/2014/05/bash-getopts/


------------------------------------------------------
http://www.politicos.org.br
Post by Tiago Tarifa ***@gmail.com [shell-script]
Pessoal,
Eu fiz um script e gostaria de tratar os parâmetros passados antes mesmo
"Estrutura: restaura.sh [opções] <arquivoDeConfiguração> [lista-pacotes.txt]
-c, --conf Restaura o sistema baseado no arquivo
Confs<dataDoBackup>.tar.bz2
dj-restaura.sh -c arquivo-confs.tar.bz2
lista-pacotes.txt
-s, --sistema Restaura o sistema através do arquivo
Sistema<dataDoBackup>.tar.bz2
-u, --desfazer Volta o backup feito da ultima alteração do sistema.
-f, --force Não faz perguntas.
-h, --help Mostra esta ajuda e sai.
-V, --version Mostra a versão e sai."
$ restaura.sh -cf --conf ....
Também não pode chamar o (-u|--desfazer) com o (-c|--conf) e/ou com
(-s|--sistema)
$ restaura.sh -s arquivo -u -c arquivo2 arquivo_lista
Eu tentei usar expressões regulares com o grep de várias formas. A que
Também tentei com a opção -c do grep, mas parece que ele conta apenas
quantas linhas casou com a ER e não quantas vezes a ER casou com a linha.
Alguém tem uma dica, exemplo ou até mesmo link de algum padrão que já é
seguido?
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2016-10-20 23:42:36 UTC
Permalink
Fala Tiago,
dá uma olhadinha nisso aqui:
http://wiki.softwarelivre.org/TWikiBar/TWikiBarPapo010#Comando_getopts.
Está em português e cheia de exemplos.

Abcs,
Julio
*@juliobash*

*Próximos cursos de Shell*
*Cidade Local Período*
*​*
*São Paulo 4Linux
<https://www.4linux.com.br/curso/programacao-em-shell-script> 05-09/12*
Dou treinamento de *Shell* em qualquer cidade.
Post by Tiago Tarifa ***@gmail.com [shell-script]
Pessoal,
Eu fiz um script e gostaria de tratar os parâmetros passados antes mesmo
"Estrutura: restaura.sh [opções] <arquivoDeConfiguração> [lista-pacotes.txt]
-c, --conf Restaura o sistema baseado no arquivo
Confs<dataDoBackup>.tar.bz2
dj-restaura.sh -c arquivo-confs.tar.bz2
lista-pacotes.txt
-s, --sistema Restaura o sistema através do arquivo
Sistema<dataDoBackup>.tar.bz2
-u, --desfazer Volta o backup feito da ultima alteração do sistema.
-f, --force Não faz perguntas.
-h, --help Mostra esta ajuda e sai.
-V, --version Mostra a versão e sai."
$ restaura.sh -cf --conf ....
Também não pode chamar o (-u|--desfazer) com o (-c|--conf) e/ou com
(-s|--sistema)
$ restaura.sh -s arquivo -u -c arquivo2 arquivo_lista
Eu tentei usar expressões regulares com o grep de várias formas. A que
Também tentei com a opção -c do grep, mas parece que ele conta apenas
quantas linhas casou com a ER e não quantas vezes a ER casou com a linha.
Alguém tem uma dica, exemplo ou até mesmo link de algum padrão que já é
seguido?
Tiago Tarifa tiagotarifa@gmail.com [shell-script]
2016-10-21 12:15:44 UTC
Permalink
Sidney e Julio, obrigado pela dica do getopts.

Vou estudar ela também.
Post by 'Julio C. Neves' ***@gmail.com [shell-script]
Fala Tiago,
dá uma olhadinha nisso aqui: http://wiki.softwarelivre.org/
TWikiBar/TWikiBarPapo010#Comando_getopts. Está em português e cheia de
exemplos.
Abcs,
Julio
*Próximos cursos de Shell*
*Cidade Local Período*
*​*
*São Paulo 4Linux
<https://www.4linux.com.br/curso/programacao-em-shell-script> 05-09/12*
Dou treinamento de *Shell* em qualquer cidade.
Post by Tiago Tarifa ***@gmail.com [shell-script]
Pessoal,
Eu fiz um script e gostaria de tratar os parâmetros passados antes mesmo
"Estrutura: restaura.sh [opções] <arquivoDeConfiguração> [lista-pacotes.txt]
-c, --conf Restaura o sistema baseado no arquivo
Confs<dataDoBackup>.tar.bz2
dj-restaura.sh -c arquivo-confs.tar.bz2
lista-pacotes.txt
-s, --sistema Restaura o sistema através do arquivo
Sistema<dataDoBackup>.tar.bz2
-u, --desfazer Volta o backup feito da ultima alteração do sistema.
-f, --force Não faz perguntas.
-h, --help Mostra esta ajuda e sai.
-V, --version Mostra a versão e sai."
$ restaura.sh -cf --conf ....
Também não pode chamar o (-u|--desfazer) com o (-c|--conf) e/ou com
(-s|--sistema)
$ restaura.sh -s arquivo -u -c arquivo2 arquivo_lista
Eu tentei usar expressões regulares com o grep de várias formas. A que
Também tentei com a opção -c do grep, mas parece que ele conta apenas
quantas linhas casou com a ER e não quantas vezes a ER casou com a linha.
Alguém tem uma dica, exemplo ou até mesmo link de algum padrão que já é
seguido?
Loading...