Visite também: Currículo ·  Efetividade BR-Mac

O que é LinuxDownload LinuxApostila LinuxEnviar notícia


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:

  1. {lista},

    onde
    lista

    são cadeias separadas por vírgulas;

  2. {inicio..fim};
  3. prefixo{****},

    onde os asteriscos
    (****)

    podem ser substituídos por
    lista

    ou por um par
    inicio..fim;

  4. {****}sufixo,

    onde os asteriscos
    (****)

    podem ser substituídos por
    lista

    ou por um par
    inicio..fim;

  5. prefixo{****}sufixo, onde os asteriscos (****) podem ser substituídos por lista ou por um par inicio..fim;
  6. {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).


• Publicado por Augusto Campos em 2011-02-21

Comentários dos leitores

Os comentários são responsabilidade de seus autores, e não são analisados ou aprovados pelo BR-Linux. Leia os Termos de uso do BR-Linux.

    Paulo Cesar (usuário não registrado) em 21/02/2011 às 9:11 am

    cada dia que vejo artigos assim, eu fico mais assustado com tamanho poder que o bash tem.

    Suhanko (usuário não registrado) em 21/02/2011 às 9:26 am

    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.

    Juliano (usuário não registrado) em 21/02/2011 às 10:57 am

    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.

    poi (usuário não registrado) em 21/02/2011 às 10:59 am

    Instalei o bash 4 e deu um resultado diferente aqui:

    $ echo ${TimeBom:-5}
    Fluminense

    Fabricio (usuário não registrado) em 21/02/2011 às 12:14 pm

    @poi: Deve ser bug no seu bash! kkk

    Muito bom o artigo, parabéns!

    Igor Ramos Tiburcio (usuário não registrado) em 21/02/2011 às 12:16 pm

    Uso o zsh, mas o bash também é excelente (é andar e esbarrar em algo feito pra ele). Ótimas dicas.

    Rael Gugelmin Cunha (usuário não registrado) em 21/02/2011 às 12:32 pm

    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.

    tonyfrasouza (usuário não registrado) em 21/02/2011 às 12:57 pm

    É 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…

    foobob (usuário não registrado) em 21/02/2011 às 1:44 pm

    hmm, o primeiro recurso claramente vindo de Python. É bom saber que o velho shell ainda pode evoluir…

    Lucas Timm (usuário não registrado) em 21/02/2011 às 1:48 pm

    @itamarnet

    Manda eles redimensionarem 2 mil imagens de qualquer resolução pra 1280×1024 usando apenas ferramentas de clicar…

    Itamar (usuário não registrado) em 21/02/2011 às 2:01 pm

    @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

    Weber Jr . (usuário não registrado) em 21/02/2011 às 2:17 pm

    @Itamar

    “Nem assim eles se convenceram.Então desisto”

    Fez bem em desistir, porque não se trata de *convencer*. ;)

    Thiago A. (usuário não registrado) em 21/02/2011 às 2:46 pm

    Ferramenta de clicar, a única que conheço que faz o serviço é o automator do Mac…

    Bremm (usuário não registrado) em 21/02/2011 às 6:58 pm

    @ 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

    André Machado (usuário não registrado) em 21/02/2011 às 6:59 pm

    Eu não sabia que o BR-Linux aceitava esse tipo de contribuição…

    psantos (usuário não registrado) em 21/02/2011 às 8:27 pm

    Botelho Carvalho! ha ha ha ha!
    Esse é o bom e velho Júlio Neves

    Patola (usuário não registrado) em 21/02/2011 às 8:44 pm

    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.

    André Machado (usuário não registrado) em 22/02/2011 às 11:04 am

    @Patola

    Só por sua causa, eu fui compelido a escrever este pequeno tutorial sobre alguns dos recursos do Zsh: http://va.mu/ABv .

Este post é antigo (2011-02-21) e foi arquivado. O envio de novos comentários a este post já expirou.