Opções nao estao sendo ativadas no shell script [RESOLVIDO]

13. Re: Opções nao estao sendo ativadas no shell script

Paulo
paulo1205

(usa Ubuntu)

Enviado em 31/05/2023 - 04:22h

Sugestões:

1) Lembre de quem pode não ter cor no terminal, de quem não necessariamente usa terminal com fundo escuro, e de quem pode não ter as cores que você pensou.

Se quiser realmente usar cores, use-as de forma mais mnemônica, compatível com diferentes tipos de terminal e mais fácil de ler. Por exemplo:
ncolors=$(tput colors)
if (( ncolors>=256 )); then
# Com 256 cores, a cor é calculada como 16+36*R+6*G+B (R, G e B variam de 0 a 5). Cores entre 232 e 255 são 24 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 231).
o=$(tput setaf 46) # cor das opções: verde brilhante (R,G,B=0,5,0).
c=$(tput setaf 21) # cor do comando: azul brilhante (R,G,B=0,0,5).
s=$(tput setaf 201) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=5,0,5)
a=$(tput setaf 196) # cor da indicação de alternativa: vermelho brilhante (R,G,B=5,0,0)
n=$(tput setaf 231) # cor “normal”: branco puro (R,G,B=5,5,5)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
r=$(tput sgr0) # reset de cores do terminal
elif (( ncolors>=88 )); then
# Com 88 cores, a cor é calculada como 16+16*R+4*G+B (R, G e B variam de 0 a 3). Cores entre 80 e 87 são 8 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 79).
o=$(tput setaf 28) # cor das opções: verde brilhante (R,G,B=0,3,0).
c=$(tput setaf 19) # cor do comando: azul brilhante (R,G,B=0,0,3).
s=$(tput setaf 67) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=3,0,3)
a=$(tput setaf 64) # cor da indicação de alternativa: vermelho brilhante (R,G,B=3,0,0)
n=$(tput setaf 79) # cor “normal”: branco puro (R,G,B=3,3,3)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
elif (( ncolors>=16 )); then
# Com 16 cores, as cores são calculadas como 8*H+4*B+2*G+R, com H, R, G e B podendo valer 0 ou 1; R, G e B como 0 indicam intensidade 0, e 1 indica intensidade 2/3; H igual a 1 soma 1/3 à intensidade de todas as cores simultaneamente.
o=$(tput setaf 10) # cor das opções: verde brilhante (H,B,G,R=1,0,1,0).
c=$(tput setaf 12) # cor do comando: azul brilhante (H,B,G,R=1,1,0,0).
s=$(tput setaf 13) # cor do delimitador de conjunto de alternativas: magenta brilhante (H,B,G,R=1,1,0,1)
a=$(tput setaf 9) # cor da indicação de alternativa: vermelho brilhante (H,B,G,R=1,0,0,1)
n=$(tput setaf 15) # cor “normal”: branco (H,B,G,R=1,1,1,1)
b=$(tput setab 0) # cor do fundo: preto (H,B,G,R=0,0,0,0)
elif (( ncolors>=8 )); then
# Com 8 cores, as cores são calculadas como 4*B+2*G+R, com R, G e B podendo valor 0 (desligada) ou 1 (ligada). Note que eu removi o adjetivo “brilhante” da descrição das cores; mesmo o branco pode não ser tão branco assim.
# Note o uso de setf/setb em lugar de setaf/setab.
o=$(tput setf 2) # cor das opções: verde (B,G,R=0,1,0).
c=$(tput setf 4) # cor do comando: azul (B,G,R=1,0,0).
s=$(tput setf 5) # cor do delimitador de conjunto de alternativas: magenta (B,G,R=1,0,1)
a=$(tput setf 1) # cor da indicação de alternativa: vermelho (B,G,R=0,0,1)
n=$(tput setf 7) # cor “normal”: “branco” (B,G,R=1,1,1)
b=$(tput setb 0) # cor do fundo: preto (B,G,R=0,0,0)
else
# Supõe que não tem cores. Em vez disso, tentar usar bold (“bold”), itálico (“sitm”), sublinhado (“smul”) e texto invertido (“rev”).
o=$(tput smul) # opção: liga itálico (não funciona em todos os terminais; talvez sublinhado (“smul”) seja melhor).
c=$(tput bold) # comando: liga modo bold
s=$(tput bold) # delimitador de conjunto de alternativas: liga modo bold
a=$(tput bold) # indicação de alternativa: liga modo bold
n=$(tput sgr0) # texto normal: nenhum atributo
b="" # “cor do fundo”: string vazia, para não mexer em nada.
fi
r=$(tput sgr0) # reset de atributos do terminal

# Abaixo, às vezes eu ponho "$n" imediatamente seguido por outra mudança; para cores, pode parecer redundante, mas para monocromático (bold, itálico, sublinhado e inverso), pode ser necessário, e nós estamos reaproveitando o mesmo código.
# Acho que assim fica mais limpo do que com sequências de escape diretamente. E ainda fica mais portável (se bem que eu acho que o (ab)uso de cores deixa a interface mais feia).
echo -e "$b$n\n${a}Usage$n$o:$n $c$0$n $s($n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"
\n$s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador$s($n$o--url$n$s)$n $c=$n \"$owww.vivaolinux.com.br$n\"\n$r"


2) quiser é com s, não com z.

3) Em lugar de
OPTS=$(getopt -a -n ${0} -o f,g,t,w,l,h --long url:,help -- "$@") 
, considere fazer o seguinte.
OPTS=( $(getopt -a -n ${0} -o fgtwlh --long url:,help -- "$@") ) 


As vírgulas que você usou para as opções curtas são desnecessárias (erradas: elas habilitam a você usar uma opção “-,”).

Colocar a execução de getopt dentro de um par de parênteses fará de OPTS um array com um argumento ou opção de linha de comando por elemento. Desse modo, você poderá varrer esse array sem necessariamente ter sobrescrever os argumentos originais passados ao script (mas se quiser sobrescrevê-los, não vai precisar de eval, bastará usar “set -- "${OPTS[@]}"”).

4) Não entendi o porquê desta construção. Particularmente, os “shift 2” me parecem bem estranhos.

while :; do
case "$1" in
-f)
N=1
NAVEGADOR="${FIREFOX}"
shift 2
;;

-l)
N=1
NAVEGADOR="${LYNX}"
shift 2
;;

# ... outros testes de opções...

esac
done


Eis algo parecido com o que eu faria.
abort_browser () {
help
echo "$0: ERRO: especifique apenas um navegador." >&2
exit 1
}

abort_layout () {
help
echo "$0: ERRO: especifique apenas um modo do layout." >&2
exit 1
}

for (( n=0; n<${#OPTS[@]}; ++n )); do
case "${OPTS[$n]}" in
-f)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$FIREFOX"
;;
-l)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$LYNX"
;;
-g)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$CHROME"
;;
-t)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
TAB="$NEWTAB"
;;
-j)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
JANELA="$WINDOW"
;;
# ... etc. ...
esac
done



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


  


14. Re: Opções nao estao sendo ativadas no shell script [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 31/05/2023 - 18:02h


paulo1205 escreveu:

Sugestões:

1) Lembre de quem pode não ter cor no terminal, de quem não necessariamente usa terminal com fundo escuro, e de quem pode não ter as cores que você pensou.

Se quiser realmente usar cores, use-as cores de forma mais mnemônica, compatível com diferentes tipos de terminal e mais fácil de ler. Por exemplo:
ncolors=$(tput colors)
if (( ncolors>=256 )); then
# Com 256 cores, a cor é calculada como 16+36*R+6*G+B (R, G e B variam de 0 a 5). Cores entre 232 e 255 são 24 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 231).
o=$(tput setaf 46) # cor das opções: verde brilhante (R,G,B=0,5,0).
c=$(tput setaf 21) # cor do comando: azul brilhante (R,G,B=0,0,5).
s=$(tput setaf 201) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=5,0,5)
a=$(tput setaf 196) # cor da indicação de alternativa: vermelho brilhante (R,G,B=5,0,0)
n=$(tput setaf 231) # cor “normal”: branco puro (R,G,B=5,5,5)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
r=$(tput sgr0) # reset de cores do terminal
elif (( ncolors>=88 )); then
# Com 88 cores, a cor é calculada como 16+16*R+4*G+B (R, G e B variam de 0 a 3). Cores entre 80 e 87 são 8 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 79).
o=$(tput setaf 28) # cor das opções: verde brilhante (R,G,B=0,3,0).
c=$(tput setaf 19) # cor do comando: azul brilhante (R,G,B=0,0,3).
s=$(tput setaf 67) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=3,0,3)
a=$(tput setaf 64) # cor da indicação de alternativa: vermelho brilhante (R,G,B=3,0,0)
n=$(tput setaf 79) # cor “normal”: branco puro (R,G,B=3,3,3)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
elif (( ncolors>=16 )); then
# Com 16 cores, as cores são calculadas como 8*H+4*B+2*G+R, com H, R, G e B podendo valer 0 ou 1; R, G e B como 0 indicam intensidade 0, e 1 indica intensidade 2/3; H igual a 1 soma 1/3 à intensidade de todas as cores simultaneamente.
o=$(tput setaf 10) # cor das opções: verde brilhante (H,B,G,R=1,0,1,0).
c=$(tput setaf 12) # cor do comando: azul brilhante (H,B,G,R=1,1,0,0).
s=$(tput setaf 13) # cor do delimitador de conjunto de alternativas: magenta brilhante (H,B,G,R=1,1,0,1)
a=$(tput setaf 9) # cor da indicação de alternativa: vermelho brilhante (H,B,G,R=1,0,0,1)
n=$(tput setaf 15) # cor “normal”: branco (H,B,G,R=1,1,1,1)
b=$(tput setab 0) # cor do fundo: preto (H,B,G,R=0,0,0,0)
elif (( ncolors>=8 )); then
# Com 8 cores, as cores são calculadas como 4*B+2*G+R, com R, G e B podendo valor 0 (desligada) ou 1 (ligada). Note que eu removi o adjetivo “brilhante” da descrição das cores; mesmo o branco pode não ser tão branco assim.
# Note o uso de setf/setb em lugar de setaf/setab.
o=$(tput setf 2) # cor das opções: verde (B,G,R=0,1,0).
c=$(tput setf 4) # cor do comando: azul (B,G,R=1,0,0).
s=$(tput setf 5) # cor do delimitador de conjunto de alternativas: magenta (B,G,R=1,0,1)
a=$(tput setf 1) # cor da indicação de alternativa: vermelho (B,G,R=0,0,1)
n=$(tput setf 7) # cor “normal”: “branco” (B,G,R=1,1,1)
b=$(tput setb 0) # cor do fundo: preto (B,G,R=0,0,0)
else
# Supõe que não tem cores. Em vez disso, tentar usar bold (“bold”), itálico (“sitm”), sublinhado (“smul”) e texto invertido (“rev”).
o=$(tput smul) # opção: liga itálico (não funciona em todos os terminais; talvez sublinhado (“smul”) seja melhor).
c=$(tput bold) # comando: liga modo bold
s=$(tput bold) # delimitador de conjunto de alternativas: liga modo bold
a=$(tput bold) # indicação de alternativa: liga modo bold
n=$(tput sgr0) # texto normal: nenhum atributo
b="" # “cor do fundo”: string vazia, para não mexer em nada.
fi
r=$(tput sgr0) # reset de atributos do terminal

# Abaixo, às vezes eu ponho "$n" imediatamente seguido por outra mudança; para cores, pode parecer redundante, mas para monocromático (bold, itálico, sublinhado e inverso), pode ser necessário, e nós estamos reaproveitando o mesmo código.
# Acho que assim fica mais limpo do que com sequências de escape diretamente. E ainda fica mais portável (se bem que eu acho que o (ab)uso de cores deixa a interface mais feia).
echo -e "$b$n\n${a}Usage$n$o:$n $c$0$n $s($n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"
\n$s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador$s($n$o--url$n$s)$n $c=$n \"$owww.vivaolinux.com.br$n\"\n$r"


2) quiser é com s, não com z.

3) Em lugar de
OPTS=$(getopt -a -n ${0} -o f,g,t,w,l,h --long url:,help -- "$@") 
, considere fazer o seguinte.
OPTS=( $(getopt -a -n ${0} -o f,g,t,w,l,h --long url:,help -- "$@") ) 


As vírgulas que você usou para as opções curtas são desnecessárias (erradas: elas habilitam a você usar uma opção “-,”).

Colocar a execução de getopt dentro de um par de parênteses fará de OPTS um array com um argumento ou opção de linha de comando por elemento. Desse modo, você poderá varrer esse array sem necessariamente ter sobrescrever os argumentos originais passados ao script (mas se quiser sobrescrevê-los, não vai precisar de eval, bastará usar “set -- "${OPTS[@]}"”).

4) [b]Não entendi o porquê desta construção. Particularmente, os “[b]shift 2” me parecem bem estranhos.

while :; do
case "$1" in
-f)
N=1
NAVEGADOR="${FIREFOX}"
shift 2
;;

-l)
N=1
NAVEGADOR="${LYNX}"
shift 2
;;

# ... outros testes de opções...

esac
done


Eis algo parecido com o que eu faria.
abort_browser () {
help
echo "$0: ERRO: especifique apenas um navegador." >&2
exit 1
}

abort_layout () {
help
echo "$0: ERRO: especifique apenas um modo do layout." >&2
exit 1
}

for (( n=0; n<${#OPTS[@]}; ++n )); do
case "${OPTS[$n]}" in
-f)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$FIREFOX"
;;
-l)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$LYNX"
;;
-g)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$CHROME"
;;
-t)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
TAB="$NEWTAB"
;;
-j)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
JANELA="$WINDOW"
;;
# ... etc. ...
esac
done


Os shift 2 se eu não colocar ele não mostra as opçoes e se eu usar shift ele dá loop infinito.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)




wiki.anon


15. Re: Opções nao estao sendo ativadas no shell script

Jean César
dark777

(usa Linux Mint)

Enviado em 01/06/2023 - 14:48h

dark777 escreveu:


paulo1205 escreveu:

Sugestões:

1) Lembre de quem pode não ter cor no terminal, de quem não necessariamente usa terminal com fundo escuro, e de quem pode não ter as cores que você pensou.

Se quiser realmente usar cores, use-as cores de forma mais mnemônica, compatível com diferentes tipos de terminal e mais fácil de ler. Por exemplo:
ncolors=$(tput colors)
if (( ncolors>=256 )); then
# Com 256 cores, a cor é calculada como 16+36*R+6*G+B (R, G e B variam de 0 a 5). Cores entre 232 e 255 são 24 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 231).
o=$(tput setaf 46) # cor das opções: verde brilhante (R,G,B=0,5,0).
c=$(tput setaf 21) # cor do comando: azul brilhante (R,G,B=0,0,5).
s=$(tput setaf 201) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=5,0,5)
a=$(tput setaf 196) # cor da indicação de alternativa: vermelho brilhante (R,G,B=5,0,0)
n=$(tput setaf 231) # cor “normal”: branco puro (R,G,B=5,5,5)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
r=$(tput sgr0) # reset de cores do terminal
elif (( ncolors>=88 )); then
# Com 88 cores, a cor é calculada como 16+16*R+4*G+B (R, G e B variam de 0 a 3). Cores entre 80 e 87 são 8 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 79).
o=$(tput setaf 28) # cor das opções: verde brilhante (R,G,B=0,3,0).
c=$(tput setaf 19) # cor do comando: azul brilhante (R,G,B=0,0,3).
s=$(tput setaf 67) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=3,0,3)
a=$(tput setaf 64) # cor da indicação de alternativa: vermelho brilhante (R,G,B=3,0,0)
n=$(tput setaf 79) # cor “normal”: branco puro (R,G,B=3,3,3)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
elif (( ncolors>=16 )); then
# Com 16 cores, as cores são calculadas como 8*H+4*B+2*G+R, com H, R, G e B podendo valer 0 ou 1; R, G e B como 0 indicam intensidade 0, e 1 indica intensidade 2/3; H igual a 1 soma 1/3 à intensidade de todas as cores simultaneamente.
o=$(tput setaf 10) # cor das opções: verde brilhante (H,B,G,R=1,0,1,0).
c=$(tput setaf 12) # cor do comando: azul brilhante (H,B,G,R=1,1,0,0).
s=$(tput setaf 13) # cor do delimitador de conjunto de alternativas: magenta brilhante (H,B,G,R=1,1,0,1)
a=$(tput setaf 9) # cor da indicação de alternativa: vermelho brilhante (H,B,G,R=1,0,0,1)
n=$(tput setaf 15) # cor “normal”: branco (H,B,G,R=1,1,1,1)
b=$(tput setab 0) # cor do fundo: preto (H,B,G,R=0,0,0,0)
elif (( ncolors>=8 )); then
# Com 8 cores, as cores são calculadas como 4*B+2*G+R, com R, G e B podendo valor 0 (desligada) ou 1 (ligada). Note que eu removi o adjetivo “brilhante” da descrição das cores; mesmo o branco pode não ser tão branco assim.
# Note o uso de setf/setb em lugar de setaf/setab.
o=$(tput setf 2) # cor das opções: verde (B,G,R=0,1,0).
c=$(tput setf 4) # cor do comando: azul (B,G,R=1,0,0).
s=$(tput setf 5) # cor do delimitador de conjunto de alternativas: magenta (B,G,R=1,0,1)
a=$(tput setf 1) # cor da indicação de alternativa: vermelho (B,G,R=0,0,1)
n=$(tput setf 7) # cor “normal”: “branco” (B,G,R=1,1,1)
b=$(tput setb 0) # cor do fundo: preto (B,G,R=0,0,0)
else
# Supõe que não tem cores. Em vez disso, tentar usar bold (“bold”), itálico (“sitm”), sublinhado (“smul”) e texto invertido (“rev”).
o=$(tput smul) # opção: liga itálico (não funciona em todos os terminais; talvez sublinhado (“smul”) seja melhor).
c=$(tput bold) # comando: liga modo bold
s=$(tput bold) # delimitador de conjunto de alternativas: liga modo bold
a=$(tput bold) # indicação de alternativa: liga modo bold
n=$(tput sgr0) # texto normal: nenhum atributo
b="" # “cor do fundo”: string vazia, para não mexer em nada.
fi
r=$(tput sgr0) # reset de atributos do terminal

# Abaixo, às vezes eu ponho "$n" imediatamente seguido por outra mudança; para cores, pode parecer redundante, mas para monocromático (bold, itálico, sublinhado e inverso), pode ser necessário, e nós estamos reaproveitando o mesmo código.
# Acho que assim fica mais limpo do que com sequências de escape diretamente. E ainda fica mais portável (se bem que eu acho que o (ab)uso de cores deixa a interface mais feia).
echo -e "$b$n\n${a}Usage$n$o:$n $c$0$n $s($n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"
\n$s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador$s($n$o--url$n$s)$n $c=$n \"$owww.vivaolinux.com.br$n\"\n$r"


2) quiser é com s, não com z.

3) Em lugar de
OPTS=$(getopt -a -n ${0} -o f,g,t,w,l,h --long url:,help -- "$@") 
, considere fazer o seguinte.
OPTS=($(getopt -a -n ${0} -o f,g,t,w,l,h --long url:,help -- "$@") ) 


As vírgulas que você usou para as opções curtas são desnecessárias (erradas: elas habilitam a você usar uma opção “-,”).

Colocar a execução de getopt dentro de um par de parênteses fará de OPTS um array com um argumento ou opção de linha de comando por elemento. Desse modo, você poderá varrer esse array sem necessariamente ter sobrescrever os argumentos originais passados ao script (mas se quiser sobrescrevê-los, não vai precisar de eval, bastará usar “set -- "${OPTS[@]}"”).

4) [b]Não entendi o porquê desta construção. Particularmente, os “[b]shift 2” me parecem bem estranhos.

while :; do
case "$1" in
-f)
N=1
NAVEGADOR="${FIREFOX}"
shift 2
;;

-l)
N=1
NAVEGADOR="${LYNX}"
shift 2
;;

# ... outros testes de opções...

esac
done


Eis algo parecido com o que eu faria.
abort_browser () {
help
echo "$0: ERRO: especifique apenas um navegador." >&2
exit 1
}

abort_layout () {
help
echo "$0: ERRO: especifique apenas um modo do layout." >&2
exit 1
}

for (( n=0; n<${#OPTS[@]}; ++n )); do
case "${OPTS[$n]}" in
-f)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$FIREFOX"
;;
-l)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$LYNX"
;;
-g)
[[ -z "$NAVEGADOR ]] || abort_browser
NAVEGADOR="$CHROME"
;;
-t)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
TAB="$NEWTAB"
;;
-j)
[[ ( -z "$TAB" ) -a ( -z "$JANELA" ) ]] || abort_layout
JANELA="$WINDOW"
;;
# ... etc. ...
esac
done


Os shift 2 se eu não colocar ele não mostra as opçoes e se eu usar shift ele dá loop infinito.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)




wiki.anon


Eu percebi que o fato de nao estar mostrando as opçoes no terminal eram devidos as funçoes:

abort_browser()
e
abort_layout()


Eu refiz algumas coisas e agora parece que esta funcionando mas nao entendi bem se a forma correta de utilizar as funçoes abort_browser e abort_layout é a que eu utilizei no coidigo. Só tem um problema quando executo o código ele as cores que vc sugeriu sobrescreve todo plano de fundo do terminal tentei utilizar as opçoes de reset e nao obtive sucesso como faria para voltar as cores de fundo originais do terminal após o código ser executado sem ter que fechar a aba do terminal? E quando usei OPTS=($()) usando o for ele nao executou tambem não.
O meu código atual é este:

#!/usr/bin/bash

#set -x

## origin: https://www.vivaolinux.com.br/script/Abrir-arquivos-em-nova-aba-no-Firefox

F=0
G=0
J=0
A=0
L=0
LY=0

TAB="--new-tab"

WINDOW="--new-window"

TAB_KTERMINAL="konsole --new-tab -- bash -c"
TAB_GTERMINAL="gnome-terminal --tab -- bash -c"

LYNX="$(which lynx)"

FIREFOX="$(which firefox)"

## Opções de --new-tab e --new-window OK
CHROME="$(which google-chrome)"

## URL default
PAGE="http://www.vivaolinux.com.br"

ncolors=$(tput colors)

if ((ncolors >= 256)); then
# Com 256 cores, a cor é calculada como 16+36*R+6*G+B (R, G e B variam de 0 a 5). Cores entre 232 e 255 são 24 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 231).
o=$(tput setaf 46) # cor das opções: verde brilhante (R,G,B=0,5,0).
c=$(tput setaf 21) # cor do comando: azul brilhante (R,G,B=0,0,5).
s=$(tput setaf 201) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=5,0,5)
a=$(tput setaf 196) # cor da indicação de alternativa: vermelho brilhante (R,G,B=5,0,0)
n=$(tput setaf 231) # cor "normal": branco puro (R,G,B=5,5,5)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)
r=$(tput sgr0) # reset de cores do terminal

elif ((ncolors >= 88)); then
# Com 88 cores, a cor é calculada como 16+16*R+4*G+B (R, G e B variam de 0 a 3). Cores entre 80 e 87 são 8 tons de cinza, do mais escuro ao mais claro (excluindo preto puro, que é a cor 16, e branco puro, que é 79).
o=$(tput setaf 28) # cor das opções: verde brilhante (R,G,B=0,3,0).
c=$(tput setaf 19) # cor do comando: azul brilhante (R,G,B=0,0,3).
s=$(tput setaf 67) # cor do delimitador de conjunto de alternativas: magenta brilhante (R,G,B=3,0,3)
a=$(tput setaf 64) # cor da indicação de alternativa: vermelho brilhante (R,G,B=3,0,0)
n=$(tput setaf 79) # cor "normal": branco puro (R,G,B=3,3,3)
b=$(tput setab 16) # cor do fundo: preto puro (R,G,B=0,0,0)

elif ((ncolors >= 16)); then
# Com 16 cores, as cores são calculadas como 8*H+4*B+2*G+R, com H, R, G e B podendo valer 0 ou 1; R, G e B como 0 indicam intensidade 0, e 1 indica intensidade 2/3; H igual a 1 soma 1/3 à intensidade de todas as cores simultaneamente.
o=$(tput setaf 10) # cor das opções: verde brilhante (H,B,G,R=1,0,1,0).
c=$(tput setaf 12) # cor do comando: azul brilhante (H,B,G,R=1,1,0,0).
s=$(tput setaf 13) # cor do delimitador de conjunto de alternativas: magenta brilhante (H,B,G,R=1,1,0,1)
a=$(tput setaf 9) # cor da indicação de alternativa: vermelho brilhante (H,B,G,R=1,0,0,1)
n=$(tput setaf 15) # cor "normal": branco (H,B,G,R=1,1,1,1)
b=$(tput setab 0) # cor do fundo: preto (H,B,G,R=0,0,0,0)

elif ((ncolors >= 8)); then
# Com 8 cores, as cores são calculadas como 4*B+2*G+R, com R, G e B podendo valor 0 (desligada) ou 1 (ligada). Note que eu removi o adjetivo "brilhante" da descrição das cores; mesmo o branco pode não ser tão branco assim.
# Note o uso de setf/setb em lugar de setaf/setab.
o=$(tput setf 2) # cor das opções: verde (B,G,R=0,1,0).
c=$(tput setf 4) # cor do comando: azul (B,G,R=1,0,0).
s=$(tput setf 5) # cor do delimitador de conjunto de alternativas: magenta (B,G,R=1,0,1)
a=$(tput setf 1) # cor da indicação de alternativa: vermelho (B,G,R=0,0,1)
n=$(tput setf 7) # cor "normal": "branco" (B,G,R=1,1,1)
b=$(tput setb 0) # cor do fundo: preto (B,G,R=0,0,0)

else
# Supõe que não tem cores. Em vez disso, tentar usar bold ("bold"), itálico ("sitm"), sublinhado ("smul") e texto invertido ("rev").
o=$(tput smul) # opção: liga itálico (não funciona em todos os terminais; talvez sublinhado ("smul") seja melhor).
c=$(tput bold) # comando: liga modo bold
s=$(tput bold) # delimitador de conjunto de alternativas: liga modo bold
a=$(tput bold) # indicação de alternativa: liga modo bold
n=$(tput sgr0) # texto normal: nenhum atributo
b="" # "cor do fundo": string vazia, para não mexer em nada.
fi

r=$(tput sgr0) # reset de atributos do terminal

function help() {

echo -e "$b$n\n${a}Usage$n$o:$n $c$0$n $s($n$o-l$n $a|$n$n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"
$s($n$o-l$n$s) $c=$n para abrir com o lynx
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome
$s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador $s($n$o--url$n$s)$n $c=$n \"${o}www.vivaolinux.com.br$n\"\n\n$n$r"

exit 0
}

OPTS=$(getopt -a -n ${0} -o fgltwh --long url:,help -- "$@") || exit

eval set -- "${OPTS}"

if [ $# -lt 3 ]; then

help
else

while :; do

case ${1} in

-f)
F=1

[[ -z "${NAVEGADOR}" ]] && NAVEGADOR="${FIREFOX}"

shift
;;

-g)
G=1

[[ -z "${NAVEGADOR}" ]] && NAVEGADOR="${CHROME}"

shift
;;

-l)
LY=1
[[ -z "${NAVEGADOR}" ]] && NAVEGADOR="${LYNX}"

shift
;;

-t)
A=1

[[ -z "${NEWTAB}" ]] && NEWTAB="${TAB}"

[[ -z "${TERMINAL}" && -n "$(which gnome-terminal)" ]] && TERMINAL="${TAB_GTERMINAL}"

[[ -z "${TERMINAL}" && -n "$(which konsole)" ]] && TERMINAL="${TAB_KTERMINAL}"

shift
;;

-w)
J=1
[[ -z "${JANELA}" ]] && JANELA="${WINDOW}"

[[ -z "${TERMINAL}" && -n "$(which gnome-terminal)" ]] && TERMINAL="${TAB_GTERMINAL}"

[[ -z "${TERMINAL}" && -n "$(which konsole)" ]] && TERMINAL="${TAB_KTERMINAL}"
shift
;;

--url)
L=1
URL="${2}"
shift 2
;;

-h | --help)
help
shift
;;

--) #Skip
shift
break
;;

esac
done
fi

## Abre a url na proxima aba do emulador de terminal
if [[ ${LY} -eq 1 && ${A} -eq 1 && ${L} -eq 1 ]]; then

${TERMINAL} ${NAVEGADOR} ${URL}

## Abre a url padrão na proxima aba do emulador de terminal
elif [[ ${LY} -eq 1 && ${A} -eq 1 && ${L} -eq 0 ]]; then

${TERMINAL} ${NAVEGADOR} ${PAGE}

## Abre a url na aba atual do emulador de terminal
elif [[ ${LY} -eq 1 && $J -eq 1 && ${L} -eq 1 ]]; then

${TERMINAL} ${NAVEGADOR} ${URL}

## Abre a url padrão na aba atual do emulador de terminal
elif [[ ${LY} -eq 1 && ${J} -eq 1 && ${L} -eq 0 ]]; then

${TERMINAL} ${NAVEGADOR} ${PAGE}

elif [[ $G -eq 1 && ${A} -eq 1 && ${L} -eq 1 ]]; then

${NAVEGADOR} ${NEWTAB} ${URL}

elif [[ $G -eq 1 && ${A} -eq 1 && ${L} -eq 0 ]]; then

${NAVEGADOR} ${NEWTAB} ${PAGE}

elif [[ $G -eq 1 && ${J} -eq 1 && ${L} -eq 1 ]]; then

${TERMINAL} ${NAVEGADOR} ${JANELA} ${URL}

elif [[ $G -eq 1 && ${J} -eq 1 && ${L} -eq 0 ]]; then

${TERMINAL} ${NAVEGADOR} ${JANELA} ${PAGE}

elif [[ $F -eq 1 && ${A} -eq 1 && ${L} -eq 1 ]]; then

${NAVEGADOR} ${NEWTAB} ${URL}

elif [[ $F -eq 1 && ${A} -eq 1 && ${L} -eq 0 ]]; then

${NAVEGADOR} ${NEWTAB} ${PAGE}

elif [[ $F -eq 1 && ${J} -eq 1 && ${L} -eq 1 ]]; then

${TERMINAL} ${NAVEGADOR} ${JANELA} ${URL}

elif [[ $F -eq 1 && ${J} -eq 1 && ${L} -eq 0 ]]; then

${TERMINAL} ${NAVEGADOR} ${JANELA} ${PAGE}

fi


#$r



## Para resetar todas as cores?
$r

Quando eu coloco esta opção no fim do codigo ele me informa:

./url2: linha 227: $'\E(B\E[m': comando não encontrado

@alexabolada

wiki.anon


16. Re: Opções nao estao sendo ativadas no shell script [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/06/2023 - 14:23h

dark777 escreveu:

Eu percebi que o fato de nao estar mostrando as opçoes no terminal eram devidos as funçoes:

abort_browser()
e
abort_layout()


Eu refiz algumas coisas e agora parece que esta funcionando mas nao entendi bem se a forma correta de utilizar as funçoes abort_browser e abort_layout é a que eu utilizei no coidigo.


A ideia é de que cada uma dessas funções imprime uma mensagem de erro (dependendo de se o parâmetro que provocou erro é referente ao navegador escolhido ou ao modo de execução como aba ou como janela; mais especificamente, não é permitido usar mais de uma opção de seleção do navegador nem mais de uma opção de seleção de modo de exibição) e sair do script imediatamente em seguida, em função de se ter feito uma invocação com parâmetros inválidos.

Pode ser que a minha demonstração de em quais condições essas funções são invocadas tenha ficado com erro (especialmente porque eu assumi que os parâmetros usados nos testes não possuem nenhum valor previamente atribuído, o que talvez não fosse verdade quando você levou esse código para o seu script). Contudo, a ideia de uma linha como
[[ -z "$NAVEGADOR" ]] || abort_browser 
(que, por sinal, ficou com um fechamento de aspas faltando no código que eu postei originalmente, pelo que peço desculpas) aparecendo no contexto de processamento de um argumento que seleciona o navegador a ser utilizado é se a variável NAVEGADOR não estiver vazia, então o navegador já foi anteriormente selecionado por algum outro argumento já processado, logo é um erro ter um segundo argumento de seleção de navegador, e por isso o programa invoca a função que imprime a mensagem de erro apropriada e aborta a execução.

Só tem um problema quando executo o código ele as cores que vc sugeriu sobrescreve todo plano de fundo do terminal tentei utilizar as opçoes de reset e nao obtive sucesso como faria para voltar as cores de fundo originais do terminal após o código ser executado sem ter que fechar a aba do terminal?


Não sei se entendi corretamente o que você quis dizer, mas em função do que creio que entendi, você pode estar tendo efeitos colaterais referentes à forma como cada tipo de emulador de terminal trata o fundo da tela, e por isso fiz alguns testes aqui.

Com o konsole (eu sou usuário de KDE, e, além disso sempre prefiro terminal (e qualquer outro programa) com fundo branco/claro e letras petras/escuras por padrão), depois de ter definido as variáveis com os códigos de escolha de cada cor, se eu executar o comando
echo -e "$b$n\n${a}Usage$n$o:$n $c$0$n $s($n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"
\n $s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome
$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador
$s($n$o--url$n$s)$n $c=$n \"$owww.vivaolinux.com.br$n\"\n$r"
próximo ao topo da tela (i.e. de modo que não provoque deslocamento de linhas para cima durante), o resultado que eu obtenho é semelhante ao da primeira figura, mostrando que o fundo da tela só é alterado nas colunas em que efetivamente foram impressos caracteres. Por outro lado, se for próximo ao final da tela, as linhas que tiverem sido criadas após o deslocamento para cima (scrolling) aparecem com fundo totalmente escuro, mesmo nas colunas em que eu não tiver mandado gerar caracteres, conforme mostra a segunda figura anexa (no primeiro comando, parte de linhas ficou com o fundo parcialmente branco porque essas linhas ainda estava suficientemente longe do final da tela para não provocar scrolling, já o segundo estava no final da tela mesmo; note, porém, que mesmo o segundo não ficou com uma linha com fundo preto antes da primeira linha de texto, como eu esperava que ficasse, de acordo com a sequência de mudar a cor primeiro e depois quebrar a linha, conforme escrito logo no começo do argumento passado ao comando echo: “$b$n\n”).

Em função disso, eu fiz alguns experimentos usando, por exemplo, o comando clear imediatamente antes ou imediatamente depois de mandar a sequência de mudança de cor fundo e de texto, e vi que quando eu o enviava após mudar o fundo da tela, todo o fundo ficava preto.

Experimentando mais um pouco, vi que eu obtinha exatamente o efeito que eu queria se enviasse a sequência de escape para limpeza da posição corrente do cursor até o fim da tela tanto no início (logo após mudar as cores com “$b$n”) quanto no final da mensagem impressa (após o reset com ”$r”). Assim sendo, eu defini uma variável nova
cles=$(tput ed)	# Limpa (na prática, atualizando atributos, incluindo cor de fundo, e preenchendo com espaços) da posição corrente até o fim da tela. 
e alterei o comando de impressão para usar duas vezes essa variável, para que tanto a mensagem que eu quero imprimir ficasse formatada adequadamente quanto o restante da tela voltasse ao estado normal. Além disso, eu notei que isso funcionava melhor quando eu usava a opção -n do echo, e eu mesmo mandar imprimir explicitamente duas quebras de linha ao final da mensagem (a primeira para indicar o fim de linha da última linha de texto, e a segunda para efetivamente pular uma linha, antes de fazer o reset das cores), em vez de deixar o echo gerar uma quebra de linha automaticamente após imprimir a mensagem.
echo -ne "$b$n$cles\\n${a}Usage$n$o:$n $c$0$n $s($n$o-f$n $a|$n $o-g$n$s)$n $s($n$o-t$n $a|$n $o-w$n$s)$n $s($n$o--url$n$s)$n$c=$n\"${o}www.vivaolinux.com.br$n\"\\n
$s($n$o-f$n$s) $c=$n para abrir com o mozilla-firefox
$s($n$o-g$n$s) $c=$n para abrir com o google-chrome
$s($n$o-t$n$s) $c=$n para abrir uma nova aba no navegador aberto
$s($n$o-w$n$s)$n $c=$n para abrir uma nova janela do navegador
$s($n$o--url$n$s)$n $c=$n \"$owww.vivaolinux.com.br$n\"\\n\\n$r$cles"


Fazendo desse modo, eu obtenho resultados consistentes em qualquer posição da tela, quer haja scrolling, quer não. Contudo, eu não posso garantir que os resultados serão iguais com outros emuladores de terminal (xterm, gnome-terminal, screen, byobu, terminator etc., muitos dos quais eu nem tenho instalados na minha máquina). Eu acredito, no entanto, que tem grandes chances de também funcionar melhor com essa nova forma do que com a que eu sugeri em minha postagem anterior.

(É o problema de a gente usar ferramentas que não conhece plenamente. Quantos de nós algum dia paramos para ler a documentação completa dos nossos emuladores de terminal, incluindo as sequências de escape que eles reconhecem e como elas são implementadas?)

E quando usei OPTS=($()) usando o for ele nao executou tambem não.


Como você tinha feito?

Eu admito que várias das sugestões que eu fiz na mensagem anterior fora escritas diretamente no navegador, sem testar efetivamente (exceto no caso das mudanças de cor, que eu realmente testei bastante tanto naquela ocasião quanto mais ainda agora).

Como eu disse antes, a ideia de transformar OPTS em array é justamente não ter de redefinir os argumentos passados ao script (i.e. não usar “set -- $OPTS”, “set -- "${OPTS[@]}”” nem coisa parecida).

Dessa vez testando, eis como eu faria.
#!/bin/bash

help () {
echo "Mensagem de help (ver na postagem, acima)."
}

abort_browser () {
{ help; echo -e "\\nArgumento inválido/duplicado na seleção de navegador."; } >&2
exit 1
}

abort_layout () {
{ help; echo -e "\\nArgumento inválido/duplicado na seleção de modo de exibição."; } >&2
exit 1
}

abort_url () {
{ help; echo -e "\\nArgumento inválido/duplicado na especificação de URL."; } >&2
exit 1
}


declare -A KONSOLE_MODES GNOME_TERM_MODES FIREFOX_MODES CHROME_MODES

LYNX="/usr/bin/lynx"
FIREFOX="/usr/bin/firefox"
CHROME="/usr/bin/google-chrome"
KONSOLE="/usr/bin/konsole"
GNOME_TERMINAL="/usr/bin/gnome-terminal"
XTERM="/usr/bin/xterm"
QDBUS="/usr/bin/qdbus"

KONSOLE_MODES=(TAB "--new-tab" WINDOW "")
GNOME_TERM_MODESs=(TAB "--tab" WINDOW "--window")
FIREFOX_MODES=(TAB "--new-tab" WINDOW "--new-window")
CHROME_MODES=(TAB "" WINDOW "--new-window")

DEFAULT_URL="https://www.vivaolinux.com.br/"
DEFAULT_BROWSER="$FIREFOX"
DEFAULT_MODE="WINDOW" # Possíveis valores: "WINDOW" ou "TAB".

unset BROWSER MODE URL


OPTS=( "$(/usr/bin/getopt -q -a -n ${0} -o hfgltw --long url:,help -- "$@")" )
if (( $? )); then
{ help ; echo -e "\\nArgumento inválido."; } >&2
exit 1
fi
eval OPTS=( "${OPTS[@]}" )
n_args=${#OPTS[@]}

for (( n=0; n<n_args; ++n )); do
case "${OPTS[$n]}" in
-h|--help)
help
exit 0
;;
-f)
[[ -z "$BROWSER" ]] || abort_browser
BROWSER="firefox"
;;
-g)
[[ -z "$BROWSER" ]] || abort_browser
BROWSER="chrome"
;;
-l)
[[ -z "$BROWSER" ]] || abort_browser
BROWSER="lynx"
;;
-t)
[[ -z "$MODE" ]] || abort_layout
MODE="TAB"
;;
-w)
[[ -z "$MODE" ]] || abort_layout
MODE="WINDOW"
;;
--url)
( [[ -z "$URL" ]] && (( n+1<n_args )) ) || abort_url
URL="${OPTS[$((++n))]}"
;;
--)
((++n))
break
;;
esac
done
[[ -z "$URL" ]] && URL="$DEFAULT_URL"
[[ -z "$BROWSER" ]] && BROWSER="$DEFAULT_BROWSER"
[[ -z "$MODE" ]] && MODE="$DEFAULT_MODE"

if [[ -n "$DEBUG" ]]; then
cat <<EOM
Navegador: ${BROWSER}
Modo: ${MODE}
URL: $URL
Demais argumentos (descartados): "${OPTS[@]:$((n)):$((n_args-n))}"
EOM
fi

case "$BROWSER" in
lynx)
konsole_running=0
gnome_term_running=0
exec 3< <("$QDBUS" 2>/dev/null)
while read -u 3 line; do
case "$line" in
*org.kde.konsole-*)
((++konsole_running))
;;
*org.gnome.Terminal)
((++gnome_term_running))
;;
esac
done
echo "$konsole_running $gnome_term_running"
exec 3<&-
if ((konsole_running)) || ( ((!gnome_term_running)) && [[ -x "$KONSOLE" ]] ); then
COMMAND=("$KONSOLE" ${KONSOLE_MODES[$MODE]} "-e" "$LYNX" "$URL")
elif ((gnome_term_running)) || ( ((!konsole_running)) && [[ -x "$GNOME_TERMINAL" ]] ); then
COMMAND=("$GNOME_TERMINAL" ${GNOME_TERMINAL_MODES[$MODE]} "--" "$LYNX" "$URL")
elif [[ -x "$XTERM" ]]; then
COMMAND=("$XTERM" "-e" "$LYNX" "$URL")
else
echo "$0: ERROR: cannot find valid terminal emulator.\n" >&2
exit 1
fi
;;
firefox)
COMMAND=("$FIREFOX" ${FIREFOX_MODES[$MODE]} "$URL")
;;
chrome)
COMMAND=("$CHROME" ${CHROME_MODES[$MODE]} "$URL")
;;
esac

exec "${COMMAND[@]}"


## Para resetar todas as cores?
$r

Quando eu coloco esta opção no fim do codigo ele me informa:

./url2: linha 227: $'\E(B\E[m': comando não encontrado


Na verdade, o que você teria de fazer é um “echo "$r"", mas veja a discussão acima sobre usar também a limpeza desde a posição corrente do cursor até o final da tela.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts