Como fazer um script com argumentos e parametros? [RESOLVIDO]

1. Como fazer um script com argumentos e parametros? [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 25/04/2023 - 23:18h


Olá galera beleza? estou tendando fazer um script que passa parametros e através deste parametros executará uma tarefa mas nao estou entendendo por que ele nao esta mostrando as opçoes que eu escolhi na varivael em que eu seto os argumentos e os long options tambem estão dando erro como posso resover este problema?

Os erros são este abaixo:

$ bash args_bash.sh -help
args_bash.sh: opção inválida -- “e”
args_bash.sh: opção inválida -- “l”

$ bash args_bash.sh -uwiki -pprojeto1 -c"projeto teste"
args_bash.sh: opção inválida -- “w”
args_bash.sh: opção inválida -- “i”
args_bash.sh: opção inválida -- “k”
args_bash.sh: opção inválida -- “i”
args_bash.sh: opção inválida -- “r”
args_bash.sh: opção inválida -- “o”
args_bash.sh: opção inválida -- “j”
args_bash.sh: opção inválida -- “e”
args_bash.sh: opção inválida -- “t”
args_bash.sh: opção inválida -- “o”
args_bash.sh: opção inválida -- “1”


minha intenção é usar:

$ bash script.sh -u<usuario> -p<nome_projeto> -c"comentario sobre o projeto"



O códito para testar os comandos é este abaixo:


#!/bin/bash

args=$(getopt -o upc:,h -l user,proj,commit:,help -n "${0}" -- "$@") || exit

eval set -- "$args"

function help() {
echo -e "\e[1;31mUsage\033[1;32m: \033[1;31m${0##*/} \033[1;34m[ -u \"your_user_git\" | --user ]\n\n[ -p \"project_name\" | --proj ]\n\n[ -c \"comemt alter project\" | --commit ]\n\n[ -h | --help]\n\n"
}

while [[ $1 != "--" ]]; do
case "${1}" in
-h | --help)
help
shift 1
;;

-u | --user)
user="$2"
shift 2
;;

-p | --proj)
projeto="$3"
shift 3
;;

-c | --commit)
comentario="$4"
shift 4
;;

# shouldn't happen unless we're missing a case
*)
echo "unexpected option: ${1}" >&2
exit 1
;;
esac
done

shift # skip '--'
echo "$user $projeto $comentario"

echo "remaining non-option arguments: $@"


wiki.anon




  


2. Re: Como fazer um script com argumentos e parametros?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/04/2023 - 00:04h

Boa noite Dark.
optargs, só aceita "opções curtas". = -h e não --help.
Não coloque o hífen para casar as opções.

Segue exemplo:
#!/usr/bin/env bash

sep=$(printf "%28s"|sed -r 's/ /-/g;s/.{5}/& /;s/ -{10}/& /;s/ -{5}/& /2');
cb='\e[1;34m';cy='\e[1;33m';cr='\e[1;38m';fc='\e[m';
COLS=$(tput cols);
lin='&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;';

usage(){
printf "\x1bc${cy}${sep}
Uso: $0 -[cmph]lN\n${sep}${fc}
m - ordena por memória.
c - ordena por cpu.
p - ordena por processo
l - Nº de linhas (opcional).
v - versão.
h - este.
${cy}${sep}${fc}\n";
exit 0;
}

versao(){
v="V1.00:Abril:2023";
printf "\x1bc${cb}\e[2;$(((COLS-25)/2))f${lin}\e[3;$(((COLS-27)/2))f| Versão:${v} |\e[4;$(((COLS-27)/2))f| https://goo.gl/dYY7i9 |\e[5;$(((COLS-25)/2))f${lin}$fc\n\n";
exit 0;
}

msgerro(){
printf "\nERRO! $1 : [$2]\nUso: $0 -[cmpvh]lN\n"
exit 0;
}

function GetOpts(){
while getopts ':cmpvhl:' OPCAO; do
case $OPCAO in
c) echo "Opcão:$OPCAO";;
m) echo "Opcão:$OPCAO";;
p) echo "Opcão:$OPCAO";;
l) echo "Opcão:$OPCAO OPTARG:$OPTARG";;
v) echo "Opcão:$OPCAO";versao;;
h) echo "Opcão:$OPCAO";usage ;;
:) printf "${cr}OPÇãO \"-${OPTARG}\", REQUER ARGUMENTO."${cf}"\n" >&2;sleep 2;usage ;;
?) printf "${cr}OPÇãO INVáLIDA: \"-${OPTARG}\""${cf}"\n" >&2;sleep 2;usage ;;
esac
done
executar $@
}

function executar(){
echo "\nExecuta o Script: $0 $@\n"
}

[ "$#" -eq 0 ] && msgerro "[1]" "Requer argumento."
[[ ! "$@" =~ (^[-][mcpvh]) ]] && msgerro "[2]" "Falta &#9472;"

GetOpts $@



______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



3. Re; Como fazer um script com argumentos e parametros?

Mohammad Storey
Peacock87

(usa Outra)

Enviado em 26/04/2023 - 06:53h

Para criar um script com argumentos e parâmetros em uma linguagem de programação, é necessário definir as variáveis de entrada, capturar os argumentos passados pela linha de comando e utilizar esses valores como parâmetros em sua lógica de programação.

https://www.pfmlogin.net/


4. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 26/04/2023 - 13:20h


msoliver escreveu:

Boa noite Dark.
optargs, só aceita "opções curtas". = -h e não --help.
Não coloque o hífen para casar as opções.

Segue exemplo:
#!/usr/bin/env bash

sep=$(printf "%28s"|sed -r 's/ /-/g;s/.{5}/& /;s/ -{10}/& /;s/ -{5}/& /2');
cb='\e[1;34m';cy='\e[1;33m';cr='\e[1;38m';fc='\e[m';
COLS=$(tput cols);
lin='&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;';

usage(){
printf "\x1bc${cy}${sep}
Uso: $0 -[cmph]lN\n${sep}${fc}
m - ordena por memória.
c - ordena por cpu.
p - ordena por processo
l - Nº de linhas (opcional).
v - versão.
h - este.
${cy}${sep}${fc}\n";
exit 0;
}

versao(){
v="V1.00:Abril:2023";
printf "\x1bc${cb}\e[2;$(((COLS-25)/2))f${lin}\e[3;$(((COLS-27)/2))f| Versão:${v} |\e[4;$(((COLS-27)/2))f| https://goo.gl/dYY7i9 |\e[5;$(((COLS-25)/2))f${lin}$fc\n\n";
exit 0;
}

msgerro(){
printf "\nERRO! $1 : [$2]\nUso: $0 -[cmpvh]lN\n"
exit 0;
}

function GetOpts(){
while getopts ':cmpvhl:' OPCAO; do
case $OPCAO in
c) echo "Opcão:$OPCAO";;
m) echo "Opcão:$OPCAO";;
p) echo "Opcão:$OPCAO";;
l) echo "Opcão:$OPCAO OPTARG:$OPTARG";;
v) echo "Opcão:$OPCAO";versao;;
h) echo "Opcão:$OPCAO";usage ;;
:) printf "${cr}OPÇãO \"-${OPTARG}\", REQUER ARGUMENTO."${cf}"\n" >&2;sleep 2;usage ;;
?) printf "${cr}OPÇãO INVáLIDA: \"-${OPTARG}\""${cf}"\n" >&2;sleep 2;usage ;;
esac
done
executar $@
}

function executar(){
echo "\nExecuta o Script: $0 $@\n"
}

[ "$#" -eq 0 ] && msgerro "[1]" "Requer argumento."
[[ ! "$@" =~ (^[-][mcpvh]) ]] && msgerro "[2]" "Falta &#9472;"

GetOpts $@



______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



Mas eu estou utilizando OPTARG que pelo que eu vi é tanto para opçoes curtas como ongas só nao entendi como fazer o script funcionar corretamente
wiki.anon


5. Re: Como fazer um script com argumentos e parametros?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/04/2023 - 19:30h

args=$(getopt -o upc:,h -l user,proj,commit:,help -n "${0}" -- "$@") || exit
Agora que observei, está usando o "getopt",
Desconsidere a mensagem anterior, a qual, refere-se ao "getopts".

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



6. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 26/04/2023 - 22:11h


msoliver escreveu:

args=$(getopt -o upc:,h -l user,proj,commit:,help -n "${0}" -- "$@") || exit
Agora que observei, está usando o "getopt",
Desconsidere a mensagem anterior, a qual, refere-se ao "getopts".

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


Entao eu preciso que o script execute tanto opçoes curtar como opçoes longas @alexabolada

wiki.anon


7. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 26/04/2023 - 22:12h

Olá, wiki.anon! Entendi que você deseja criar um script que aceite opções curtas e longas. Para fazer isso, recomendo o uso do [b]getopt[\/b] em seu script, como você já mencionou na citação de msoliver.

Aqui está um exemplo de como você pode implementar essa funcionalidade no seu script:

[code]
#!/bin/sh

# Processa os argumentos usando getopt
TEMP=$(getopt -o upc:h --long user,proj,commit:,help -- "$@")

if [ $? != 0 ]; then
echo "Erro ao obter as opções"
exit 1
fi

# Atribui os argumentos às variáveis
eval set -- "$TEMP"

# Crie variáveis para armazenar os valores dos argumentos
USER=
PROJ=
COMMIT=

while true; do
case "$1" in
-u|--user)
USER=1
shift
;;
-p|--proj)
PROJ=1
shift
;;
-c|--commit)
COMMIT="$2"
shift 2
;;
-h|--help)
echo "Ajuda:"
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para projeto"
echo "-c | --commit: Opção para commit com


8. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 27/04/2023 - 15:07h


alexabolada escreveu:

Olá, wiki.anon! Entendi que você deseja criar um script que aceite opções curtas e longas. Para fazer isso, recomendo o uso do [b]getopt[\/b] em seu script, como você já mencionou na citação de msoliver.

Aqui está um exemplo de como você pode implementar essa funcionalidade no seu script:

[code]
#!/bin/sh

# Processa os argumentos usando getopt
TEMP=$(getopt -o upc:h --long user,proj,commit:,help -- "$@")

if [ $? != 0 ]; then
echo "Erro ao obter as opções"
exit 1
fi

# Atribui os argumentos às variáveis
eval set -- "$TEMP"

# Crie variáveis para armazenar os valores dos argumentos
USER=
PROJ=
COMMIT=

while true; do
case "$1" in
-u|--user)
USER=1
shift
;;
-p|--proj)
PROJ=1
shift
;;
-c|--commit)
COMMIT="$2"
shift 2
;;
-h|--help)
echo "Ajuda:"
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para projeto"
echo "-c | --commit: Opção para commit com"


@alexabolada eu testei o que vc me sugeriu mas ele fica dando loop infinito

wiki.anon


9. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 27/04/2023 - 15:08h

Olá, wiki.anon! Desculpe pelo inconveniente causado pelo meu exemplo anterior. Vamos ajustar o loop para resolver o problema do loop infinito. Substitua o `while true` e seu conteúdo pelo seguinte:


while [ $# -gt 0 ]; do
case "$1" in
-u|--user)
USER=1
shift
;;
-p|--proj)
PROJ=1
shift
;;
-c|--commit)
COMMIT="$2"
shift 2
;;
-h|--help)
echo "Ajuda:"
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para projeto"
echo "-c | --commit: Opção para commit com"
exit 0
;;
--)
shift
break
;;
*)
echo "Opção inválida: $1"
exit 1
;;
esac
done


Ao usar `while [ $# -gt 0 ]`, o loop executará apenas enquanto houver argumentos a serem processados. Além disso, adicionei um caso para lidar com `--`, que é adicionado pelo `getopt` ao final dos argumentos processados. Isso deve resolver o problema do loop infinito.

Espero que isso


10. Re: Como fazer um script com argumentos e parametros?

Jean César
dark777

(usa Linux Mint)

Enviado em 28/04/2023 - 15:42h

alexabolada escreveu:

Olá, wiki.anon! Desculpe pelo inconveniente causado pelo meu exemplo anterior. Vamos ajustar o loop para resolver o problema do loop infinito. Substitua o `while true` e seu conteúdo pelo seguinte:


while [ $# -gt 0 ]; do
case "$1" in
-u|--user)
USER=1
shift
;;
-p|--proj)
PROJ=1
shift
;;
-c|--commit)
COMMIT="$2"
shift 2
;;
-h|--help)
echo "Ajuda:"
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para projeto"
echo "-c | --commit: Opção para commit com"
exit 0
;;
--)
shift
break
;;
*)
echo "Opção inválida: $1"
exit 1
;;
esac
done


Ao usar `while [ $# -gt 0 ]`, o loop executará apenas enquanto houver argumentos a serem processados. Além disso, adicionei um caso para lidar com `--`, que é adicionado pelo `getopt` ao final dos argumentos processados. Isso deve resolver o problema do loop infinito.

Espero que isso


@alexabolada meu codigo esta assim:

#!/bin/bash

# Processa os argumentos usando getopt
TEMP=$(getopt -o upc:h --long user,proj,commit:,help -- "$@")

# Atribui os argumentos às variáveis
eval set -- "$TEMP"

while [ $# -gt 0 ]; do
case "$1" in

-u | --user)
USER_GIT="${OPTARG}"
shift
;;

-p | --proj)
PROJECT_NAME="${OPTARG}"
shift
;;

-c | --commit)
COMMIT="${OPTARG}"
shift
;;

-h | --help)
echo "Ajuda:"
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para projeto"
echo "-c | --commit: Opção para commit com"
;;
--)
shift
break
;;
*)
echo "Opção inválida: $1"
exit 1
;;
esac

done
echo "${USER_GIT} ${PROJECT_NAME} ${COMMIT}"



E ainda assim fica dando loop infinito quando eu executo

script.sh -h

ou

script.sh --help

E tambem percebi que tem algum problema com o shift que nao entendi bem como usar:

Quando digito:
./args.sh -u teste -p proj -c "coment proj"

Opção inválida: coment proj

E as variáveis não estao pegando os argumentos digitados.
wiki.anon


11. Re: Como fazer um script com argumentos e parametros? [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 28/04/2023 - 15:42h

Olá, wiki.anon! Percebi que você está utilizando a variável "OPTARG" para obter os valores dos argumentos. No entanto, é necessário utilizar "$2" para acessar o valor do argumento atual no loop. Além disso, o loop deve ser ajustado para processar corretamente os casos em que não há argumentos a serem processados. Aqui está o código ajustado:

[code]
#!/bin/bash

# Processa os argumentos usando getopt
TEMP=$(getopt -o u:p:c:h --long user:,proj:,commit:,help -- "$@")

# Atribui os argumentos às variáveis
eval set -- "$TEMP"

while [ $# -gt 0 ]; do
case "$1" in

-u|--user)
USER_GIT="$2"
shift 2
;;

-p|--proj)
PROJECT_NAME="$2"
shift 2
;;

-c|--commit)
COMMIT="$2"
shift 2
;;

-h|--help)
echo "Ajuda:"
echo "-u|--user: Opção para usuário"
echo "-p|--proj: Opção para projeto"
echo "-c|--commit: Opção para commit com"
exit 0
;;

--)
shift
break
;;

*)
echo "Opção invál


12. Re: Como fazer um script com argumentos e parametros?

Jean César
dark777

(usa Linux Mint)

Enviado em 28/04/2023 - 20:30h

alexabolada escreveu:

Olá, wiki.anon! Percebi que você está utilizando a variável "OPTARG" para obter os valores dos argumentos. No entanto, é necessário utilizar "$2" para acessar o valor do argumento atual no loop. Além disso, o loop deve ser ajustado para processar corretamente os casos em que não há argumentos a serem processados. Aqui está o código ajustado:


#!/bin/bash

# Processa os argumentos usando getopt
TEMP=$(getopt -o u:p:c:h --long user:,proj:,commit:,help -- "$@")

# Atribui os argumentos às variáveis
eval set -- "$TEMP"

while [ $# -gt 0 ]; do
case "$1" in

-u|--user)
USER_GIT="$2"
shift 2
;;

-p|--proj)
PROJECT_NAME="$2"
shift 2
;;

-c|--commit)
COMMIT="$2"
shift 2
;;

-h|--help)
echo "Ajuda:"
echo "-u|--user: Opção para usuário"
echo "-p|--proj: Opção para projeto"
echo "-c|--commit: Opção para commit com"
exit 0
;;

--)
shift
break
;;

*)
echo "Opção inválida";;



@alexabolada deu maior trampo pra fazermos este script funcionar eu tinha varios outros exemplos aqui e nenhum funcionava direito sempre dava loop infinito
Após fazer mais ums testes vi que ao digitar "script.sh -h | --help" ele dava loop infinito ainda entao acrescentei o shift após a função help.

O script ficou desta forma abaixo funcionando corretamente por enquanto:
[code]
#!/bin/bash

function help() {
echo "Usage: ${0##*/} -u <usuario_git> -p <project_name_push_github> -c \"comentario sobre finalidade projeto\" "
echo "-u | --user: Opção para usuário"
echo "-p | --proj: Opção para nome do projeto"
echo "-c | --commit: Opção para comentar o projeto"
}

# Processa os argumentos usando getopt
# Os : após as opçoes força a digitar um argumento

OPTS=$(getopt -o u:,p:,c:,h --long user:,proj:,commit:,help -n ${0} -- "$@") || exit

# Atribui os argumentos às variáveis
eval set -- "${OPTS}"

while :; do
case "${1}" in

-u | --user)
USER_GIT="${2}"

#Para pegar o argumento 2 após a opção
shift 2
;;

-p | --proj)
PROJECT_NAME="${2}"

#Para pegar o argumento 2 após a opção
shift 2
;;

-c | --commit)
COMMIT="${2}"

#Para pegar o argumento 2 após a opção
shift 2
;;

-h | --help)
help

# Para não dar loop infinito ao usar -h | --help
shift
;;

--)
# Skip --
shift
break
;;
*)
echo "Opção inválida: ${1}"
exit 1
;;
esac

done

echo -e "\n\nUsuarioGit: ${USER_GIT}\n\nProjeto: ${PROJECT_NAME}\n\nComentario criação/projeto: ${COMMIT}\n\n"


wiki.anon



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts