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:
2) quiser é com s, não com z.
3) Em lugar de, considere fazer o seguinte.
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.
Eis algo parecido com o que eu faria.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)
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 -- "$@") 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)

