Algumas novidades do Bash 4.0, por Julio Neves: substituições
O Julio Neves, uma das referências nacionais sobre shell script, autor de obras sobre o assunto e instrutor frequente em cursos sobre Bash e Zenity, enviou o artigo abaixo sobre algumas das novidades trazidas na versão 4 do Bash, que publico na íntegra com os agradecimentos ao mestre!
Algumas novidades do Bash 4.0
Por Julio Neves
1 – Novas substituições de parâmetros
1.1 - ${parâmetro:n}
Equivale a um
cut
com a opção
-c,
porém muito mais rápido. Preste a atenção, pois neste caso, a origem da contagem é zero.
$ TimeBom=Flamengo
$ echo ${TimeBom:3}
mengo
Essa Expansão de Parâmetros que acabamos de ver, também pode extrair uma sub cadeia, do fim para o principio, desde que seu segundo argumento seja negativo.
$ echo ${TimeBom: -5}
mengo
$ echo ${TimeBom:-5}
Flamengo
$ echo ${TimeBom:(-5)}
mengo
1.2 – ${!parâmetro}
Isto equivale a uma indireção, ou seja devolve o valor apontado por uma variável cujo nome está armazenada em parâmetro.
Exemplo:
$ Ponteiro=VariavelApontada
$ VariavelApontada=”Valor Indireto”
$ echo “A variável $Ponteiro aponta para ”$Ponteiro”
> que indiretamente aponta para ”${!Ponteiro}”"
A variável $Ponteiro aponta para “VariavelApontada”
que indiretamente aponta para “Valor Indireto”
1.3 – ${!parâmetro@} ou ${!parâmetro*}
Ambas expandem para os nomes das variáveis prefixadas por parâmetro. Não notei nenhuma diferença no uso das duas sintaxes.
Exemplos:
Vamos listar as variáveis do sistema começadas com a cadeia
GNOME:
$ echo ${!GNOME@}
GNOME_DESKTOP_SESSION_ID GNOME_KEYRING_PID GNOME_KEYRING_SOCKET
$ echo ${!GNOME*}
GNOME_DESKTOP_SESSION_ID GNOME_KEYRING_PID GNOME_KEYRING_SOCKET
1.4 – ${parâmetro^} e ${parâmetro,}
Essas expansões foram introduzidas a partir do Bash 4.0 e modificam a caixa das letras do texto que está sendo expandido. Quando usamos circunflexo
(^),
a expansão é feita para maiúsculas e quando usamos vírgula
(,),
a expansão é feita para minúsculas.
Exemplo:
$ Nome=”botelho”
$ echo ${Nome^}
Botelho
$ echo ${Nome^^}
BOTELHO
$ Nome=”botelho carvalho”
$ echo ${Nome^}
Botelho carvalho # Que pena…
Um fragmento de script que pode facilitar a sua vida:
read -p “Deseja continuar (s/n)? “
[[ ${REPLY^} == N ]] && exit
Esta forma evita testarmos se a resposta dada foi um
N
(maiúsculo) ou um
n
(minúsculo).
No Windows, além dos vírus e da instabilidade, também são frequentes nomes de arquivos com espaços em branco e quase todos em maiúsculas. No próximo exemplo veremos como passá-los para minúsculas:
$ cat trocacase.sh
#!/bin/bash
# Se o nome do arquivo tiver pelo menos uma
#+ letra maiúscula, troca-a para minúscula
for Arq in *[A-Z]* # Pelo menos 1 minúscula
do
if [ -f "${Arq,,}" ] # Arq em minúsculas já existe?
then
echo ${Arq,,} já existe
else
mv “$Arq” “${Arq,,}”
fi
done
2 – Substituição de chaves
Elas são usadas para gerar cadeias arbitrárias, produzindo todas as combinações possíveis, levando em consideração os prefixos e sufixos.
Existiam 5 sintaxes distintas, porém o Bash 4.0 incorporou uma 6ª. Elas são escritas da seguinte forma:
-
{lista},
onde
listasão cadeias separadas por vírgulas;
- {inicio..fim};
-
prefixo{****},
onde os asteriscos
(****)podem ser substituídos por
listaou por um par
inicio..fim; -
{****}sufixo,
onde os asteriscos
(****)podem ser substituídos por
listaou por um par
inicio..fim; - prefixo{****}sufixo, onde os asteriscos (****) podem ser substituídos por lista ou por um par inicio..fim;
-
{inicio..fim..incr},
onde
incré o incremento (ou razão, ou passo). Esta foi introduzida a partir do Bash 4.0.
$ echo {1..A} # Letra e número não funfa
{1..A}
$ echo {0..15..3} # Incremento de 3, só no Bash 4
0 3 6 9 12 15
$ echo {G..A..2} # Incremento de 2 decresc, só no Bash 4
G E C A
$ echo {000..100..10} # Zeros à esquerda, só no Bash 4
000 010 020 030 040 050 060 070 080 090 100
$ eval >{a..c}.{ok,err};
$ ls ?.*
a.err a.ok b.err b.ok c.err c.ok
A sintaxe deste último exemplo pode parecer rebuscada, mas substitua o
eval
por
echo
e verá que aparece:
$ echo >{a..c}.{ok,err};
>a.ok; >a.err; >b.ok; >b.err; >c.ok; >c.err;
Ou seja o comando para o Bash criar os 6 arquivos. A função do
eval
é executar este comando que foi montado.
O mesmo pode ser feito da seguinte maneira:
$ touch {a..z}.{ok,err}
Mas no primeiro caso, usamos Bash puro, o que torna esta forma pelo menos 100 vezes mais rápida que a segunda que usa um comando externo
(touch).
cada dia que vejo artigos assim, eu fico mais assustado com tamanho poder que o bash tem.
Uau! Como sempre, fantásticas explicações. Por isso que já adquiri dois livros do Julio! :-)
E infelizmente onde trabalho, escuto vários admins dizerem que usar linha de comando é “involuir”. São os mesmos que estranharam o surgimento do PowerShell da Microsoft.
Se um dia forem capazes de entender o “poder de fogo” da linha de comando, saberão um dia que ser admin é bem mais do que pilotar o mouse.
Estou divagando demais, mas como não faze-lo, ao ver quem realmente sabe trabalhar e explorar com maestria o Shell. Não é atoa que o chamamos de mestre.
O Shell é poderoso por demais!!! O Watson por exemplo, á administrado via Shell.
Só tomem cuidado com essas novidades do Bash, pois na “vida lá fora”, o 4 vai demorar a ser utilizado, alias, o Bash é pouco utilizado pelo menos na IBM, aqui a galera utiliza muito o KSH.
Instalei o bash 4 e deu um resultado diferente aqui:
$ echo ${TimeBom:-5}
Fluminense
@poi: Deve ser bug no seu bash! kkk
Muito bom o artigo, parabéns!
Uso o zsh, mas o bash também é excelente (é andar e esbarrar em algo feito pra ele). Ótimas dicas.
Mais um ótimo material do Julio.
@itamarnet: dê o shell a quem precisa, e a interface gráfica também. Eu adoro usar o shell, mas reconheço que para o usuário casual (que quer apenas navegar e ouvir música), a interface gráfica é mais amigável.
Sobre vários servidores não usarem o bash, não sei o quanto procede ou não, mas vários especialistas em segurança falam que ele é muito inseguro (não sei se por ser tão flexível ou se tem falhas). Com certeza alguém mais experiente que eu nesse sentido pode falar melhor.
É claro que para o usuário casual o mouse é tudo. Mas um helpdesk pode sim guiar um usuário pelo terminal para resolver algum problema que só ali será resolvido. Alias, estou testando Ubuntu 11.04 alpha (somente use para testes) e fui abrir um arquivo com extensão .rar e o sistema me mostrou duas opções à escolher (RAR E 7-zip), escolhi RAR e aceitei a instalação e no término da instalação o programa abriu…
Como pode se notar o Ubuntu está tão fácil de usar que para nós que usamos o terminal puro por tantos anos é chato e dá sono de usar gerenciamento gráfico…
Brincadeira minha, pois no dia a dia uso muito o gdm, mais para gerenciar o servidor ou algo que o mouse não resolva, eu vou de linha de comando ou ctrl + alt + f1, f2 etc. no desktop…
hmm, o primeiro recurso claramente vindo de Python. É bom saber que o velho shell ainda pode evoluir…
@itamarnet
Manda eles redimensionarem 2 mil imagens de qualquer resolução pra 1280×1024 usando apenas ferramentas de clicar…
@Lucas Timm
Acredite já fiz um desafio similar para os mesmos a um tempo atrás, e eles conseguiram, usando uma programação com .Net, que precisava ser instalada, e cujo instalador tinha o tamanho de 27MB, se não me falha a memória. Demorou 9 minutos mais ou menos.
O objetivo era montar uma galeria de com thumbnails na rede interna. Usei o bom e velho convert do ImageMagic, e fiz o mesmo em um micro bem mais limitado: demorou 1 min 45 seg.
Nem assim eles se convenceram. Então desisto
@Itamar
“Nem assim eles se convenceram.Então desisto”
Fez bem em desistir, porque não se trata de *convencer*. ;)
Ferramenta de clicar, a única que conheço que faz o serviço é o automator do Mac…
@ Itamar
O Gimp tem um esquema de “batch conversion” para quem gosta de janelinhas.
http://members.ozemail.com.au/~hodsond/dbp.html
Avisa os teus colegas “espertos” que não precisam criar e usar um programa em .Net quando já existe um pronto que se chama IrfanView.
http://gd.tuwien.ac.at/graphics/irfantut/batchcon.html
Eu não sabia que o BR-Linux aceitava esse tipo de contribuição…
Botelho Carvalho! ha ha ha ha!
Esse é o bom e velho Júlio Neves
Também uso o zsh e o considero muito superior ao bash. É muito ruim vê-lo como tão invisível apenas por não ser o default (e também o padrão em muitos softwares). Infelizmente não temos quase nenhum recurso para o zsh em português e o Júlio não parece muito interessado em o popularizar. Quisera eu ter tempo para escrever algum material…
Outro shell bom também é o ksh93, que inclusive é um “ksh” real, em contraste com o pdksh que é altamente incompatível. Mas ele não chega perto do poder de um zsh e bash hoje, embora seja, pelo que parece, o com melhor desempenho.
@Patola
Só por sua causa, eu fui compelido a escrever este pequeno tutorial sobre alguns dos recursos do Zsh: http://va.mu/ABv .