1941 Frozen Front (3250)
Dicas de boas práticas de programação shell
Mo Budlong, Unix Insider, 01/09/1999
O que o #! realmente faz
Certa vez, há muito tempo atrás, o Unix possuia apenas um shell, o Bourne shell, e quando um script era escrito, o shell lia o script e executava os comandos. Então outro shell apareceu, e depois, outro. Cada shell possuia sua própria sintaxe e alguns, como o C shell, eram bastante diferentes do original. Isto significava que, se um script usava os recursos de um shell ou de outro, ele deveria ser executado usando aquele shell. Em vez de escrever:
doit
O usuáiro tinha que escrever:
/bin/ksh doit
ou:
/bin/csh doit
Para remediar esta situação, uma alteração inteligente foi feita no kernel Unix -- agora um script poderia ser escrito começando com uma combinação hash-bang (#!) na primeira linha, seguida pelo shell que executaria o script. Por exemplo, dê uma olhada no seguinte script, chamado doit:
#!/bin/ksh # # do some script here #
Neste exemplo, o kernel lê o script doit, vê o hash-bang, e continua a ler o resto da linha, onde ele encontra /bin/ksh. O kernel então inicia o Korn shell com doit como um dos argumentos, e passa a ele o script, como se o seguinte comando tivesse sido escrito:
/bin/ksh doit
Quandi o /bin/ksh começa a ler o script, ele vê o hash-bang na primeira linha como um comentário (por que ele começa com um hash), e ignora o mesmo. Para ser executado, o path completo do shel é necessário, já que o kernel não irá examinar sua variável PATH. O manipulador de hash-bang do kernel faz mais que só executar um shell alternativo, ele realmenet pega os argumentos que seguem o hash-bang e usa os mesmos como um comando, e acrescente o nome do arquivo como argumento àquele comando.
Você pode iniciar um script Perl, chamado doperl, usando o hash-bang:
#!/bin/perl # do some perl script here
Se você escrever doperl, o kernel examina o hash-bang, extrai o comando /bin/perl, e executa o mesmo como se você tivesse escrito:
/bin/perl doperl
Existem dois mecanismos em funcionamento que permitem que isto funcione. O primeiro é a interpretação do kernel do hash-bang, o segundo é que o Perl vê a primeira linha como um comentário e ignora a mesma. Esta técnica não irá funcionar com linguagens de script que não tratam linhas que começam com um hash como comentário -- nestes casos, provavelmente você terá um erro. Você não precisa se limitar a usar este método apenas para executar scripts, apesar que é onde ele é mais útil.
O seguitne script, chamado helpme, apresenta a si mesmo no terminal quando você executa o comando helpme:
#!/bin/cat vi unix editor man manual pages sh Bourne Shell ksh Korn Shell csh C Shell bash Bourne Again Shell
Este truque do kernel irá executar um argumento após o nome do comando. Para esconder a primeria linha, faça que o arquivo use o more, iniciando na segunda linha, mas certifique-se de usar o path correto:
#!/bin/more +2 vi unix editor man manual pages sh Bourne Shell ksh Korn Shell csh C Shell bash Bourne Again Shell
Ao escrever o helpme como um comando, o kernel converte isto para:
/bin/more +2 helpme
Tudo a partir da linha dois em diante é mostrado:
helpme vi unix editor man manual pages sh Bourne Shell ksh Korn Shell csh C Shell bash Bourne Again Shell etc.
Você pode usar esta técnica para criar scripts aparentemente inúteis, como um arquivo que remove a si mesmo:
#!/bin/rm
Se você der o nome de flagged a este script, a execução do mesmo irá fazer com que o comando seja executado como se você tivesse escrito:
/bin/rm flagged
Você pode usar isto em um script para indicar que você está executando alguma coisa, então execute o script para remover o mesmo:
#!/bin/ksh # first refuse to run if the flagged file exists if [ -f flagged ] then exit fi # create de thalg file echo #! /bin/rm" > flagged chmod a+x flagged # do some logic here # unflag the process by executing the flag file flagged
Antes que você comece a executar comandos longos com esta técnica, tenha em mente que os sistemas geralmente tem um limite superior (tipicamente 32 caracteres) no comprimento do código na linha #!.
Testando argumentos de linha de comando e modo de usar
Quando você escreve um shell script, os argumentos são normalmente necessários para que o script funcione corretamente. Para garantir que os argumentos façam algum sentido, é geralmente necessário validar os mesmos.
Testar para ver se há argumentos suficientes é geralmente o método mais fácil de validação. por exemplo, se você criou um script shell que pede dois nomes de arquivos para operar, teste a existência de dois argumentos na linha de comando. para fazer isto no Bourne e no Korn shell, verifique o valor de $# -- uma variável que contém a contagem de argumentos, além do próprio comando. É também uma boa pratica incluir uma mensagem que detalhe as razões por que o comando falhou. Isto é criado em uma função usage.
O script twofiles abaixo, testa se há dois argumentos na linha de comando:
#!/bin/ksh
# twofile script handles two files named on the command line
# a usage function to display help for the hapless user
usage ()
{
echo "twofiles"
echo "usage: twofiles file1 file2"
echo "Processes two files"
}
# test if we have two arguments on the command line
if [ $# != 2 ]
then
usage
exit
fi
Uma prática mais segura é validar o máximo que você puder antes de executar alguma coisa. A seguinte versão de twofiles verifica a contagem de argumentos e testa os dois arquivos. Se o arquivo 1 não existe ( if [ ! -f $1 ]) uma mensagem de erro é configurada, uma mensagem de uso é apresentada, e o programa termina. O mesmo é feito para o arquivo 2:
#!/bin/ksh
# twofiles script handles two files named on the command line
# a usage function to display help for the hapless user
# plus an additional error message if it has been filled in
usage ()
{
echo "twofiles"
echo "usage: twofiles file1 file2"
echo "Processes two files"
echo " "
echo $errmsg
}
# test if we have two arguments on the command line
if [ $# != 2 ]
then
usage
exit
fi
# test if file one exists and send an additional error message
# to usage if not found
if [ ! -f $1 ]
then
errmsg=${1}": File Not Found"
usage
exit
fi
# same for file two
if [ ! -f $2 ]
then
errmsg=${2}": File Not Found"
usage
exit
fi
# we are ok at this point so continue processing here
Note que no Korn shell você pode usar a sintaxe de teste de colchetes duplos, que é mais rápida. O colchete simples na verdade chama um programa test para testar os valores, enquanto que com o colchete duplo o teste é implementado no Korn shell e não precisa chamar um programa separado.
O teste de colchete duplo não funciona no Bourne shell:
if [[ $# != 2 ]]
ou
if [[ ! -f $1 ]]
ou
if [[ ! -f $2 ]]
Esta validação pode evitar erros posteriores na lógica do programa quando subitamente percebe-se que um arquivo está faltando. Considere isto como uma boa prática de programação.
Mo Budlong, o presidente da King Computer Services, especializado em Web Linux/Unix e desenvolvimento cliente/servidor, e atualmente está trabalhando na conversão de aplicações do Windows para o Linux. Ele publicou livros e artigos em assuntos que variam da linguagem Assembly a World Wide Web, e é o autor do best-seller Teach Yourself COBOL in 21 Days, agora em sua terceira edição. Ele está trabalhando atualmente em um livro sobre o básico do Unix.
Links para este artigo
- Artigo em formato imprimível
- Hierarquia:
Home >
Computers and Peripherals
>
Operating systems >
Network-server operating systems >
Unix network operating systems >
Unix Shells
Vim Cookbook
Vim Cookbook, por Steve OuallineEsta é a página do livro de receitas do Vim. Ele contém receitas curtas para fazer coisas simples e não tão simples no Vim. Você deverá conhecer o funcionamento básico do Vim, mas cada comando será explicado em detalhe.
Cada conjunto de instruções é um pacote completo. Sinta-se livre para escolher e pegar o que você precisa.
- Trocando Caracteres
- Trocando uma palavra por outra interativamente
- Substituindo uma palavra por outra com um comando
- Movendo Texto
- Copiando um Bloco de Texto de Outro Arquivo
- Ordenando Texto
- Tratando Makefiles e outros arquivos SOB
- Formatando um Parágrafo de Texto
- Encontrando uma função em um programa C
- Desenhando Caixas de Comentário
- Lendo uma Página Man
- Removendo Retornos de Carro de Arquivos MS-DOS
- Retirando Brancos no fim das linhas
- Oops, o arquivo está protegido contra escrita
- Trocando "Sobrenome, Nome" para "Nome Sobrenome"
- Como editar todos os arquivos que contém uma dada palavra
- Como editar todos arquivos contendo uma dada palavra usando o grep built-in
Trocando Caracteres
Se você escreve rapidamente, seus dedos podem facilmente adiantar-se à sua mente. Frequentemente as pessoas transpõe os caracteres. Por exemplo, a palavra “que” é escrita “qeu”.
Para trocar dois caracteres, por exemplo o “e” pelo “u”, coloque o cursor sob o “e” e escreva xp.
O comando “x” apaga um caracter (o “e”), e o “p” cola ele após o cursor (que está agora sob o “u”).
Trocando uma palavra por outra interativamente
O método n.Suponha que você queira trocar todas as ocorrências da palavra “idiota” pela palavra “gerente”. Mas você quer ter a chance de revisar cada alteração antes de fazê-la.
Aqui está o que você deve fazer:
Comando Descrição 1GVai ao início do documento /idiotaEncontra a primeira ocorrência da palavra “idiota” cwgerenteTroca a palavra (cw) para gerente nRepete a última busca (encontra o próximo idiota) .Repete a última edição (troca uma palavra para gerente) (se você não quer alterar a palavra, pule este passo) Repita os passos 4 e 5 até que você tenha substituído todas as ocorrências.
A Virgem o Quê!?Uma igreja recém comprou um computador e estava aprendendo a usar o mesmo. A secretária da igreja decidiu criar uma carta padrão para ser usada em serviços de funeral. Onde deveria ficar o nome da pessoa ela colocou a palavra “
”. Quando ocorria um funeral ela trocava esta palavra pelo nome verdadeiro do falecido. Certo dia houveram dois funerais, primeiro para uma senhora chamada Maria, e depois para alguém chamada Edna. Então a secretária usou a substituição global para trocar “
” para “Maria”. Até aí, tudo bem. A seguir ela gerou o serviço para o segundo funeral trocando a palavra “Maria” por “Edna”. Este foi um erro... Imagine a surpresa do Ministro quando ele começou a ler a parte que continha o Credo Apostólico e disse "Nascido da Virgem Edna"...
O Método da Linha de ComandoSuponha que você quer trocar todas as ocorrências da palavra “idiota” pela palavra “gerente”. Mas você quer ter a oportunidade de revisar cada troca antes de fazer a mesma.
Execute o comando:
:%s/\
/gerente/gc Este comando vai fazer a alteração e fazer uma pausa após a alteração para dar a você uma chance de confirmar a mesma. Você pode informar “y” para aceitar a alteração ou “n” para recusar a mesma.
As partes deste comando são:
: Entre no modo de comando %Execute este comando em todas as linhas (% é um sinônimo para “da primeira à última linha”) sAbreviação do comando :substitute (substitua). /\/ Este texto especifica o texto que estamos procurando. O \< informa ao Vim que deve combinar um início de palavra e o \> informa ao Vim que deve combinar um final de palavra /gerente/O texto substituto gcAs flags. São estas: gGlobal -- Troque todas as ocorrências, não apenas a primeira de cada linha cConfirme -- Pergunte antes de fazer cada modificação
Substituindo uma palavra por outra com um comando
Suponha que você queira substituir todas as ocorrências da palavra “idiota” pela palavra “gerente”. Nenhuma confirmação é necessária, por que todos os idiotas são gerentes.
Use o comando:
:%s/\
/gerente/g As partes deste comando são:
:Entra no modo de comando %Execute este comando em todas as linhas ( %é um sinônimo para “da primeira à última linha”)sAbreviação do comando :substitute (substitua) /\/ Este texto especifica o texto que estamos procurando. O \< informa ao Vim que deve combinar um início de palavra e o \> informa ao Vim que deve combinar um final de palavra /gerente/O texto substituto gFlag de global -- Esta opção informa ao Vim que queremos trocar todas as ocorrências na mesma linha, não apenas a primeira.
Movendo Texto
Comandos estilo ViSuponha que você queira mover um parágrafo do início do documento para o fim do mesmo. Existem várias formas de fazer isto. Neste exemplo, faremos isto usando comandos no estilo Vi. Na próxima seção faremos isto usando comandos Vim visual.
Para fazer a movimentação use os comandos:
Comando Descrição 1 Mova o cursor para o início do parágrafo que queres mover 2 maColoque uma marca de nome “a” neste ponto. (O Vim não dá indicação que o comando foi executado. Em outras palavras, não há alteração visível na tela) 3 Mova o cursor para o fim do parágrafo a ser movido 4 d'aApague o texto até a marca “a”. Este comando coloca o texto em um buffer de corte (“cut buffer”) 5 Mova o cursor para a linha em que o mesmo deve ficar. O parágrafo será colocado após esta linha 6 pCole (paste) o texto após o cursor
Método VisualSuponha que você queira mover um parágrafo do topo do documento para o fim. Existem várias formas de fazer isto. Neste exemplo, faremos isto usando o modo Visual do Vim. Na seção anterior, fizemos utilizando os comandos no estilo Vi.
Para fazer a movimentação, execute os comandos:
Comando Descrição 1 Mova o cursor para o início do parágrafo que você quer movimentar 2 vInicie o modo visual. (Se você quer mover somente linhas inteiras, use o comando v que inicia o modo visual line) 3 mova o cursor para o fim do parágrafo a ser movimentado. O texto a ser movimentado será destacado. 4 dExecute um visual delete. Em outras palavras, apague o texto destacado. 5 Mova o cursor para a linha em que o texto deve ir. O parágrafo será colocado após esta linha. 6 pCole (paste) o texto na linha abaixo do cursor
Copiando um Bloco de Texto de Outro Arquivo
Estilo ViExise mais de uma forma de copiar texto entre arquivos. Nesta seção usaremos os comandos Vi mais tradicionais. Na próxima seção, faremos a mesma operação usando o modo Visual.
Para copiar um bloco de texto entre arquivos diferentes, execute os seguintes comandos:
Comando Descrição 1 Edite o arquivo contendo o bloco que você quer copiar 2 Vá para a primeira linha do bloco a ser copiado 3 maColoque uma marca “a” nesta linha 4 Vá para a última linha do bloco a ser copiado 5 y'aCopie (yank - y) o texto da linha atual até a linha que contém a marca “a”('a)6 :split segundo-arquivoAbre outra janela no Vim contendo o segundo arquivo (o arquivo em que o texto será inserido) 7 Vá para a linha em que a inserção deve ocorrer. O texto será colado após esta linha 8 pCole o texto após o cursor
Método VisualExiste mais de uma forma de copiar texto entre arquivos. Nesta seção, usaremos os novos comandos do modo visual. Veja a seção anterior para o velho estilo Vim de fazer as coisas.
Para copiar um bloco de texto entre arquivos, execute os comandos:
Comando Descrição 1 Edite o arquivo contendo o texto a ser copiado. 2 Vá à primeira linha do bloco a ser copiado. 3 vInicie o modo visual. Se você quer copiar um bloco de linhas inteiras, use o vpara iniciar o Visual Line Mode.4 Vá à última linha do bloco a ser copiado. O texto a ser copiado será destacado. 5 yCopie (Yank - y) o texto (o texto é copiado para um buffer).6 :split segundo-arquivoAbre outra janela contendo o segundo arquivo (o arquivo para o qual o bloco de texto será copiado) 7 Vá à linha em que a inserção deve ocorrer. O texto será inserido na linha seguinte à linha do cursor 8 pColoque o texto após o cursor
Ordenando Texto
Estilo ViFrequentemente você estará editando um arquivo com uma lista de nomes no mesmo. Por exemplo, uma lista de arquivos objeto que fazem parte de um programa.
Por exemplo:
version.o pch.o getopt.o util.o getopt1.o inp.o patch.o backupfile.o
Esta lista ficaria melhor se estivesse em ordem alfabética. Ou pelo menos em ordem ASCII. Para colocar esta lista em ordem alfabética, execute os seguintes comandos:
Comando Descrição 1 Mova o cursor para a primeira linha a ser ordenada. 2 maCrie uma marca na primeira linha com o nome “a” 3 Mova o cursor para a última linha do texto a ser colocado em ordem alfabética 4 !'asortO comando !informa ao Vim para passar o texto para um comando UNIX. O'ainforma ao editor que o texto a ser passado começa na linha atual e termina na marcaa. O comando pelo qual o texto será filtrado é osort.O resultado fica parecido com o seguinte:
backupfile.o getopt1.o getopt.o inp.o patch.o pch.o util.o version.o
Atenção Na prática, o que você costuma ver em arquivos Makefiles (arquivos que são utilizados pelo UNIX para controlar compilações) é mais parecido com o seguinte:
OBJS = \ version.o \ pch.o \ getopt.o \ util.o \ getopt1.o \ inp.o \ patch.o \ backupfile.o
Note que a contra-barra (\) é usada para indicar que a linha continua na linha seguinte. Após fazer o ordenamento, ficamos com algo assim:
OBJS = \ backupfile.o getopt1.o \ getopt.o \ inp.o \ patch.o \ pch.o \ util.o \ version.o \
Os nomes estão em ordem, mas as contra-barras estão erradas. Não esqueça de corrigir isto usando a edição normal, antes de prosseguir com a compilação.
OBJS = \ backupfile.o \ getopt1.o \ getopt.o \ inp.o \ patch.o \ pch.o \ util.o \ version.o
Ordenação - Método VisualFrequentemente você estará editando um arquivo com uma lista de nomes no mesmo. Por exemplo, uma lista de arquivos objeto que constituem um programa.
Por exemplo:
version.o pch.o getopt.o util.o getopt1.o inp.o patch.o backupfile.o
Seria legal ter a lista em ordem alfabética. Ou pelo menos em ordem ASCII. Para colocar em ordem alfabética esta lista, execute os seguintes comandos:
Comando Descrição 1 Mova o cursor para a primeira linha a ser ordenada 2 vEntre no modo Visual Line 3 Mova o cursor para a última linha de texto a ser ordenado 4 !sortO comando !informa ao Vim para passar o texto destacado pelo comando UNIX informado. Neste caso, o comando será passado pelosortVeja a advertência na seção anterior, para uma descrição resumida de problemas que podem ocorrer no uso deste comando.
Tratando Makefiles e outros arquivos SOB
Um problema com o formato de arquivo usado pelo comando UNIX make é que ele é extremamente minucioso.
Por exemplo, o seguinte comando está correto:
prog: prog.c cc -g -o prog prog.c
Mas o seguinte comando não:
prog: prog.c cc -g -o prog prog.cÀ primeira vista, você pode pensar que os dois são idênticos. Mas veja com mais atenção. A linha com o “cc” no primeiro exemplo inicia com um tab. No segundo exemplo, ela começa com oito espaços. (Você não consegue descobrir a diferença entre um espaço e um tab quando impressos na tela!)
Então como você pode dizer quando está certo ou não, especialmente quando na tela (ou em papel impresso) ambos são idênticos?
A resposta é que você não consegue. Você pode pensar que é um pouco injusto. Especialmente quando o make funciona com a primeira linha e não com a segunda. Mas quem disse que o UNIX era justo?
Por sorte, o Vim tem um modo que te informa exatamente o que há no seu arquivo. Execute o comando:
:set list
Ele coloca o Vim no modo list. Quando o display é colocado no “list mode”, todos os caracteres são impressos. Tabulações são mostradas como “^I” e o fim da linha é apresentado como um $. Desta forma, no list mode, nossos dois exemplos ficam:
prog: prog.c$ ^Icc -g -o prog prog.c$
e
prog: prog.c$ cc -g -o prog prog.c$Assim é fácil ver qual linha tem a tabulação.
Formatando um Parágrafo de Texto
O Vim não é um processador de palavras. Existem algumas coisas que você pode fazer para tornar as coisas mais fáceis quando estiver editando texto.
Processadores de palavras automaticamente passam para a próxima linha quando uma linha que você está escrevendo é maior que as margens. O editor Vim deixa você fazer uma linha tão longa quanto você quiser. Executando o comando:
:set wrapmargin=70
você pode informar ao Vim para quebrar automaticamente linhas maiores que 70 caracteres (você pode ajustar este número para qualquer valor que você quiser).
Isto torna a inserção de texto muito mais fácil. Ele não resolve o problema de edição. Se você entrar um parágrafo e então decidir apagar metade das palavras na primeira linha, o Vim não vai reformatar o texto.
Você pode forçar uma reformatação de um parágrafo executando os comandos:
Comando Explicação 1 Mova o cursor para o início do parágrafo 2 gq}Reformata automaticamente o texto até o fim do parágrafo. O }indica que o comandogqdeve seguir até o fim do parágrafo atual
Encontrando uma função em um programa C
O programa Vim foi escrito por programadores para programadores. Você pode usar o mesmo para localizar procedimentos dentro de um conjunto de arquivos de programa C ou C++.
Mas antes, você precisa gerar um arquivo de tabela de conteúdo chamado de arquivo “tags”. (Este arquivo recebe o nome óbvio de tags). O comando ctags gera estes arquivos de tabela de conteúdo.
Para gerar uma tabela de conteúdo de todos os arquivos de programa C no seu diretório atual, use o comando abaixo:
$ ctags *.c
Para programas C++, use o comando abaixo:
$ ctags *.cpp
Se você utilizar uma extensão diferente que .cpp para seus arquivos C++, use a mesma em vez de
.cpp.Uma vez este arquivo seja gerado, você pode informar ao Vim que você quer editar uma função, e ele irá encontrar o arquivo que contém aquela função, e posicionar você lá. Por exemplo, se você quer editar a função
write_file, use o comando abaixo:$ vim -t write_file
Agora, suponha que você está examinando a função
write_file, e esta chama a funçãosetup_datae você quer dar uma olhada na mesma. Para saltar para aquela função, posicione o cursor no início desetup_datae pressione Ctrl+]. Isto informa ao Vim que ele deve saltar para a definição daquela função. Este reposicionamento irá ocorrer mesmo que o Vim tenha que abrir outro arquivo para isto.Nota: Se você editou o arquivo atual e não gravou as alterações, o Vim vai apresentar uma advertência e irá ignorar o comando Ctrl+].
Desenhando Caixas de Comentário
Eu gosto de colcoar grandes caixas de comentário no início de cada uma de minhas procedures. Por exemplo:
/******************************************************* * Program -- Solve it -- Solves the worlds problems. * * All of them. At once. This will be a great * * program when I finish it. * *******************************************************/
Desenhar caixas como estas é na melhor das hipóteses tedioso. Mas o Vim possui uma funcionalidade legal chamada abreviações que faz as coisas ficarem mais fáceis.
Primeiro, você precisa criar um arquivo de inicialização do Vim chamado
~/.vimrc(uma primeira olhada e o mesmo se parece com um arquivo de inicialização ex. E é. O modo de comando do Vim é na verdade um modo de editor ex).O arquivo ~/.vimrc deve conter as seguintes linhas:
:ab #b /******************************************************* :ab #e *******************************************************/
Estes comandos definem um conjunto de abreviações Vim. O que é uma abreviação Vim? É uma palavra que significa outra palavra. Quando o Vim encontra uma abreviação, ele irá expandir a mesma para a palavra completa. Neste caso definimos um abreviação chamada
#bque é expandida para a linha inicial da caixa de comentário. A abreviação#efaz o mesmo.Desta forma, para criar uma caixa de comentário entre
#b. A tela ficará parecida com:/*******************************************************
Entre os comentários, incluindo os caracteres “*” iniciais e finais. Finalmente, termine o comentário escrevendo
#e. Isto fará com que o fim do comentário seja inserido.Nota: Esta página foi escrita no Vim. Então como conseguimos entrar com o #b e #e? Fácil, escrevemos #bb e então apagamos um caracter (não poderíamos entrar #b por que seria expandido).
Outros comandos úteis que um programador pode querer colocar no seu ~/.exrc incluem:
:set autoindent :set autowrite :ab #d #define :ab #i #include :ab #b /******************************************************* :ab #e *******************************************************/ :ab #l /*-----------------------------------------------------*/ :set sw=4
A configuração autoindent faz com que o Vim indente novas linhas com a mesma quantidade de espaços/tabulações que a linha anterior. Esta opção é muito útil para escrever programas. A configuração de autowrite informa o Vim que ele deve gravar um arquivo antigo quando mudar para um outro arquivo.
As abreviações
#d,#ie#ldefinem termos úteis para programadores.Finalmente, o comando
set sw=4configura o tamanho do shift (o número de caracteres que um texto é movimentado para os lados com os comandos shift -<<e>>)Esta opção é especialmente útil se você usa indentação de 4 espaços nos seus programas C ou C++ (estudos na Rice University demonstraram que este é o melhor tamanho de indentação).
Lendo uma Página Man
Você pode utilizar o editor Vim para visualizar arquivos texto. Um dos conjuntos mais úteis de arquivos para navegação são as páginas man. Para isto, montamos uma pipeline de três comandos.
O primeiro comando é o man que obtém a página. O seguinte é o ul, que torna os códigos de escape do sublinhado (underline) e negrito (bold) em algo legível, e finalmente, usamos o Vim para navegar pelo arquivo.
Assim, o nosso comando fica:
$ man subject | ul -i | vim -
A página man será gerada e então apresentada na janela do Vim. Você pode usar seus comandos normais de edição para navegar nos arquivos.
Removendo Retornos de Carro de Arquivos MS-DOS
Se você tentou editar um arquivo MS-DOS, deve ter notado que cada linha termina com um caracter
^M. Isto é causado pela forma estranha que o MS-DOS trata o fim-de-linha.Para remover os caracteres
^Mde um arquivo MS-DOS, use o comando abaixo::1,$s/{Ctrl+V}{Ctrl+M}//{ENTER}Este comando comessa com um dois-pontos (:) para fazer o Vim entrar em modo ex. Todos comandos ex começam com um intervalo de linhas, que neste caso é da primeira linha (1) até a última linha ($). A barra indica o início do texto que deve ser substituído. O
{Ctrl+V}informa ao Vim que deve tratar o próximo caracter como um caracter normal, se ele tiver algum significado especial. O próximo caracter será{Ctrl+M}(que seria tratado como um{Enter}sem o{Ctrl+V}). A próxima barra termina o texto a ser substituído. O que segue é o texto substituto. Neste caso é nada (//).
Retirando Brancos no fim das linhas
Algumas pessoas acham que espaços no fim das linhas inúteis, um desperdício, e horríveis. Para remover os espaços em branco no fim de todas as linhas, execute o comando abaixo:
:1,$s/[
]*$// Os dois-pontos (:) fazem com que o Vim entre no modo ex. Todos comandos ex iniciam com um intervalo de linhas, que neste caso é o arquivo inteiro (da linha 1 até a última linha: $).
O primeiro conjunto de barras separa o texto a ser substituído. Os colchetes indicam que qualquer caracter dentro deles serve. Desta forma,
[combina com espaço ou tabulação. O asterisco (*) significa que o caracter anterior (espaço ou tabulação) pode ser repetido qualquer número de vezes. O cifrão ($) indica um fim de linha.] Desta forma,
[diz ao Vim para procurar por qualquer número de espaços ou tabulações que sejam seguidos por um fim de linha.]*$ Estes são substituídos pelo texto que está entre o próximo conjunto de barras. Neste caso, é nada, e os espaços e tabulações são efetivamente removidos.
Oops, o arquivo está protegido contra escrita
Digamos que você tenha editado um arquivo e tenha feito muitas alterações. Ele é um arquivo muito importante e para proteger o mesmo de qualquer edição casual, você protegeu o mesmo contra escrita, mesmo de você mesmo.
O Vim permite que você edite um arquivo protegido com pouca ou nenhuma advertência. O único problema é que quando você tenta sair usando “
ZZ” você recebe uma mensagem de erro de resposta:file.txt File is read only
e o Vim não é fechado.
O que você pode fazer? Você não quer descartar todas as alterações, mas precisa sair do Vim de forma que você possa ligar a permissão para escrita.
O truque é executar o comando
:shell. Este comando coloca você fora do Vim iniciando um processador de comandos (shell) sob o Vim.Você pode então habilitar a escrita no arquivo:
$ chmod u+w file.txt
e sai do shell, retornando ao Vim
$ exit
Finalmente, você pode forçar o Vim a escrever o arquivo utilizando o comando:
:w!
(O Vim continua pensando que o arquivo está protegido contra escrita, de forma que precisamos convencer o mesmo usando a opção “force” -
!- obrigando-o a escrever o arquivo)Nota: É uma boa idéia ficar o menor tempo possível em um processador de comandos iniciado pelo comando :shell. Isto por que é fácil esquecer que você está rodando sob o Vim. É possível iniciar um shell, e iniciar um Vim, e iniciar um shell, e iniciar um Vim, e... Usando este método, você pode facilmente consumir boa parte dos recursros da máquina e gerar muita confusão.
Mantendo suas sessões
:shellcurtas, você pode evitar muitos problemas.
Trocando "Sobrenome, Nome" para "Nome Sobrenome"
Você tem uma lista de nomes na forma:
Sobrenome, Nome
Como mudar para:
Nome Sobrenome
Isto pode ser feito com um comando:
:1,$s/\([^,]*\), \(.*$\)/\2 \1/
O dois-pontos (:) informa ao Vim que este é um comando no estilo ex.
O intervalo de linhas para este comando é o arquivo inteiro, como indicado pelo intervalo
1,¤.O
s(substitute - substituir) informa ao Vim que iremos fazer uma substituição de string.O texto antigo é uma expressão regular complexa. Os delimitadores
\( ... \)são usados para informar ao editor que o texto que combinar com a expressão regular deve receber tratamento especial.O texto no primeiro
\( ... \)é atribuído para\1no texto substituto. O segundo conjunto de texto dentro de\( ... \)é atribuído para\2, e assim por diante.Neste caso, a primeira expressão regular é qualquer quantia de caracteres que não inclua uma vírgula. O
[^,]significa tudo exceto a vírgula, e o*significa zero ou mais caracteres.A segunda expressão combina com qualquer coisa:
.*até o fim da linha:¤O resultado desta substituição é que a primeira palavra na linha é atribuída para o
\1, e a segunda parte para\2. Estes valores são usados no fim do comando para trocar as palavras.
Como editar todos os arquivos que contém uma dada palavra
Este comando envolve o fgrep, bem como o caracter especial do shell “backtick” (crase).
Para editar todos os arquivos de programa C que contenham a palavra indentation_level execute o comando:
$ vim fgrep -l indentation_level *.c
O comando
fgrep -l indentation_level *.cprocura em todos os arquivos terminados com .c pela palavra indentation_level, e lista os nomes dos arquivos.Uma vez que este comando está entre crases (`), o resultado do comando (uma lista de arquivo) toma o lugar do comando na linha de comando.
O editor Vim é então executado nestes arquivos. Os comandos
:n{Enter}e:rew{Enter}podem ser usados para trocar de arquivo.
Como editar todos arquivos contendo uma dada palavra usando o grep built-in
Inicie o Vim.
Execute o comando:
:grep >word< >file-list<
Este comando encontra a primeira localização de word nos arquivos informados e posiciona o cursor naquela linha. Você pode utilizar o comando
:cnpara encontrar a próxima ocorrência.Recomendados do Submarino
Câmera 10MP A480 Preta 3.3x Zoom Óptico e LCD 2.5" +Carregador +SD 4GB
R$ 469,00. Válido até 31/12/2009Bash em Exemplos - Parte 1
Programação Fundamental no Bourne again shell (bash)Daniel Robbins
President and CEO, Gentoo Technologies, Inc.
Março de 2000Ao aprender como programar na linguagem de script bash, sua interação diária com o Linux se tornará mais divertida e produtiva, e você estará apto a montar programas a partir dos componentes padrão do Unix (como pipelines e redireção) que você já conhece e adora. Nesta série de três partes, Daniel Robbins irá ensinar a você como programa no bash através de exemplos. Ele irá cobrir o básico (o que torna esta série excelente para iniciantes) e irá apresentar funcionalidades mais avançadas conforme a série avançar.
Conteúdo
- Você já está rodando ele
- Você já está usando ele
- Confusão com o Bash
- Variáveis de ambiente
- Cortando strings
- Substituição de comandos
- Cortando strings como um profissional
- Aplicando o corte de strings
- Declaração if
- A próxima vez
- Recursos
- Sobre o autor
Você pode estar se perguntando por que iria aprender programação Bash. Bem, aqui tem alguns motivos:
Você já está rodando ele
Se você checar, você provavelmente vai descobrir que está rodando o bash neste exato momento. Mesmo se você trocou o seu shell default, provavelmente o bash ainda está sendo executado em algum lugar em seu sistema, por que ele é o shell padrão do Linux e é usado para uma variedade de finalidades. Como o bash já está sendo executado, qualquer scripts bash adicionais que você executar são inerentemente eficientes em termos de uso de memória, por que eles compartilham a memória com qualquer processo bash em execução. Por que carregar um interpretador de 500K, se você já está executando algo que irá fazer o serviço, e fazer bem?
Você já está usando ele
Não somente você já está rodando o bash, mas você está de fato interagindo com o bash no seu dia-a-dia. Ele está sempre ali, então faz sentido aprender como usá-lo em todo seu potencial. Fazendo isto você irá tornar sua experiência com o bash mais divertida e produtiva, mas por que você deveria aprender programação no bash? Fácil, por que você já pensa em termos de execução de comandos, CPiar arquivos, fazer pipes e redireção de saída. Você não deveria aprender uma linguagem que permite você usar e construir em cima destas construções poderosas que você já sabe como usar? O shell libera o potencial de um sistema Unix, e o bash é o shell do Linux. É a cola de alto-nível entre você e a máquina. Faça seu conhecimento do bash crescer, e você automaticamente irá aumentar sua produtividade sob o Linux e UNIX -- é assim simples.
Confusão com o Bash
Aprender o bash do jeito errado pode ser um processo que cria bastante confusão. Muitos novatos teclam "man bash" para ver a página man do bash, somente para serem confrontados com uma descrição técnica e concisa da funcionalidade do shell. Outros teclam "info bash" (para ver a documentação GNU info), fazendo com que ou a página man seja reapresentada, ou (se eles tem sorte) a documentação levemente mais amigável do info aparecer.
Enquanto isto pode ser um pouco desapontador para novatos, a documentação padrão do bash não pode ser tudo para todos, e agradar a todos que já estão familiarizados com a programação shell em geral. Definitivamente existe muita informação técnica excelente na página man, mas sua utilidade para novatos é limitada.
É aqui que esta série entra. Nela, irei mostrar a você como realmente usar os componentes de programação do bash, de forma que você vai poder escrever seus próprios scripts. Ao invés de descrições técnicas, irei apresentar explicações claras, de forma que você não irá somente saber o que algo faz, mas quando você realmente vai usar este "algo". No final desta série de três partes, você vai saber escrever seus próprios scripts bash intrincados, e estar capacitado a confortavelmente usar o bash e suplementar seu conhecimento pela leitura (e entendendo!) a documentação padrão do bash. Vamos começar.
Variáveis de ambiente
Sob o bash e quase todos os outros shells, o usuário pode definir variáveis de ambiente, que são armazenas internamente como strings ASCII. Uma das coisas mais úteis sobre as variáveis de ambiente é que elas são uma parte padrão do modelo de processos do UNIX. Isto significa que as variáveis de ambiente não são exclusivas aos shell scripts, mas podem ser utilizadas por programas compilados também. Quando "exportamos" uma variável ambiente sob o bash, qualquer programa subseqüente que seja executado pode ler nossa configuração, seja ele um script shell ou não. Um bom exemplo é o comando vipw, que normalmente permite que o root edite o arquivo de senhas do sistema. Configurando a variável ambiente EDITOR com o nome do seu editor de texto favorito, você está configurando o vipw a usar este editor ao invés do vi, uma coisa bastante útil se você está acostumado com o xemacs e não gosta do vi.
A maneira padrão de definir uma variável de ambiente sob o bash é:
$ myvar='This is my environment variable!'
O comando acima define uma variável de ambiente chamada "myvar" e contém a string "This is my environment variable!". Existem várias coisas a serem notadas acima: primeiro, não há espaços em nenhum lado do sinal "="; qualquer espaço irá resultar em um erro (tente e veja por si mesmo). A segunda coisa a ser notada é que enquanto podemos dispensar as plicas se estamos definindo uma palavra, elas são necessárias quando o valor da variável de ambiente é mais que uma palavra (contém espaços ou tabulações).
Sobre Quoting
Para informações extremamente detalhadas sobre como as cotas (aspas ou plicas) podem ser utilizadas no bash, você deve olhar na seção "QUOTING", na página man do bash. A existência de sequências de caracteres especiais que são "expandidas" (substituídas) com outros valores complica a forma que as strings são tratadas no bash. Iremos ver nesta série somente as funcionalidade de quoting mais utilizadas.
Em terceiro lugar, enquanto podemos utilizar aspas duplas ao invés de aspas simples, fazer isto no exemplo acima teria causado um erro. Por quê? Por que usando aspas simples (plicas), nós desabilitamos uma funcionalidade do bash chamada de expansão, em que caracteres especiais e seqüências de caracteres são substituídas por valoers. Por exemplo, o caracter "!" é o caracter de expansão de histórico, que o bash normalmente substitui com um comando previamente usado (não iremos cobrir exçansão de histórico nesta série de artigos, por que não é frequentemente usada na programação do bash. Para mais informação sobre esta funcionalidade, veja a seção "HISTORY EXPANSION" na página man do bash). Enquanto esta funcionalidade tipo macro pode ser útil, agora queremos um ponto de exclamação literal no fim de nossa variável de ambiente, ao invés de uma macro.
Agora, vamos dar uma olhada em como estas variáveis de ambiente são utilizadas. Aqui temos um exemplo:
$ echo $myvar This is my environment variable!
Quando precedemos o nome da variável de ambiente com um $, obrigamos o bash a substituir o mesmo com o valor de myvar. Na terminologia do bash, isto é chamado de "expansão de variável". Mas, e se tentarmos o seguinte:
$ echo foo$myvarbar foo
O que queriamos era que aparecesse "fooThis is my environment variable!bar", mas não foi o que aconteceu. O que houve de errado? Em poucas palavras, a facilidade de expansão de variáveis do bash ficou confusa. Ela não conseguia saber se queríamos expandir a variável $m, $my, $myvar, $myvarbar, etc. Como podemos informar ao bash de forma mais explícita e clara a qual variáveil estamos nos referindo? Tente isto:
$ echo foo${myvar}bar fooThis is my environment variable!barComo você pode ver, podemos colocar o nome da variável de ambiente entre chaves quando ela não está claramente separada do texto que a cerca. Enquanto $myvar é mais rápido de escrever e irá funcionar a maior parte do tempo, ${myvar} pode ser tratada corretamente na maioria das situações. Por outro lado, ambos fazem a mesma coisa, e você irá encontrar as duas formas de expansão de variável no resto desta série. Você vai querer lembrar de usar a forma mais explícita com chaves quando sua variável de ambiente não está isolada do texto que a cerca por brancos (espaços ou tabulações).
Lembre que mencionamos que podemos "exportar" variáveis. Quando exportamos uma variável ambiente, ela automaticamente fica disponível no ambiente de qualquer scrip ou executável que seja executado posteriormente. Os shell scripts podem acessar a variável de ambiente usando o suporte a variáveis de ambiente interno do shell, enquanto programas C podem usar a chamada de função getenv(). A seguir há um exemplo de código C que você pode copiar e compilar -- Ele permite que se entenda as variáveis de ambiente da perspectiva do C:
myvar.c -- Um exemplo de programa C que usa variáveis de ambiente
#include <stdio.h> #include <stdlib.h> int main(void) { char *myenvvar = getenv("EDITOR"); printf( "The editor environment variable is set to %s\n", myenvvar ); }Salve o trecho acima em um arquivo chamado myenv.c e então compile o mesmo com o comando:
$ gcc myenv.c -o myenv
Agora, você tem um executável em seu diretório que, quando executado, irá escrever o valor da variável de ambiente EDITOR, se houver uma. Isto é o que acontece quando executo este programa no meu computador:
$ ./myenv The editor environment variable is set to (null)
Hmm. Como a variável não está configurada para nenhum valor, o programa C recebe uma string nula. Vamos tentar configurar a variável para algum valor específico:
$ EDITOR=xemacs $ ./myenv The editor environment variable is set to (null)
Você esperava que myenv imprimisse o valor "xemacs", mas isto não aconteceu, por que não exportamos a variável de ambiente EDITOR. Desta vez, vamos fazer isto funcionar:
$ export EDITOR $ ./myenv The editor environment variable is set to xemacs
Agora você viu com seus próprios olhos que outro processo (no caso nosso programa em C) não pode ver a variável de ambiente até que ela seja exportada. Se você quiser, pode definir e exportar a variável usando uma linha:
$ export EDITOR=xemacs
Funciona exatamente da mesma forma que a versão com duas linhas. Agora é uma boa hora para mostrar como apagar uma variável de ambiente usando o comando unset:
$ unset EDITOR $ ./myenv The editor environment variable is set to (null)
Cortando strings
dirname e basename
Note que tanto o comando dirname quanto o comando basename não examinam nenhum diretório ou arquivo no disco, eles são apenas comandos de manipulação de string.
Cortar strings -- ou seja, dividir a string original em pedaços separados, menores -- é uma das tarefas executadas diariamente pelos shell scripts. Muitas vezes, os shell scripts precisam receber um nome de caminho completo, e encontrar o nome do arquivo ou do diretório. Enquanto isto é possível (e divertido!) de fazer no bash, o executável padrão Unix basename faz isto muito bem:
$ basename /usr/local/share/doc/foo/foo.txt foo.txt $ basename /usr/home/drobbins drobbins
O basename é uma ferramenta bastante útil para cortar strings. Sua contraparte, chamada dirname, retorna a "outra" parte do caminho que o basename jogou fora:
$ dirname /usr/local/share/doc/foo/foo.txt /usr/local/share/doc/foo $ dirname /usr/home/drobbins /usr/home
Substituição de comandos
Uma coisa bastante útil para saber é como criar uma variável de ambiente que contém o resultado de um comando executável. Isto é fácil de fazer:
$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt` $ echo $MYDIR /usr/local/share/doc/foo
O que fizemos acima é chamado de "substituição de comando". Várias coisas devem ser notadas neste exemplo. Na primeira linha, simplesmente colocamos o comando que queríamos executar em back quotes (crase ou acento grave). Estas não são aspas simples ou plicas padrão, mas vem da tecla que normalmente fica acima da tecla Tab (nos teclados US). Podemos fazer exatamente a mesma coisa com a sintaxe alternativa de substituição de comando do bash:
$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt) $ echo $MYDIR /usr/local/share/doc/foo
Como você pode ver, o bash fornece várias formas de se fazer exatamente a mesma coisa. Usando substituição de comandos, podemos colocar qualquer comando ou pipeline de comandos entre `` ou $(), e atribuir o resultado a uma variável de ambiente. Muito útil! Segue um exemplo de como usar um pipeline com a substituição de comando:
bash-2.03$ MYFILES=$(ls /etc | grep pa) bash-2.03$ echo $MYFILES pam.d passwd
Cortando strings como um profissional
Enquanto basename e dirname são grandes ferramentas, existem horas que precisamos executar cortes em strings mais avançados que as manipulações de nome de diretório. Quando precisamos de cortes mais avançados, podemos usar a funcionalidade avançada de expansão de variáveis do bash. Já usamos a expansão de variável padrão, que é o ${MYVAR}. Mas o bash pode executar alguns cortes bastante úteis. Veja estes exemplos:
$ MYVAR=foodforthought.jpg $ echo ${MYVAR##*fo} rthought.jpg $ echo ${MYVAR#*fo} odforthought.jpgNo primeiro exemplo, escrevemos ${MYVAR##*fo}. O que exatamente significa isto? Basicamente, dentro do ${} nós escrevemos o nome de uma varíavel de ambiente, dois ##s, e uma expressão coringa ("*fo"). Então o bash pegou MYVAR, encontrou a maior substring do início da string "foodforthought.jpg" que combina com a expressão "*fo", e cortou ela do início da string. Isto é um pouco difícil de entender a princípio, então para ter um entendimento de como esta opção especial "##" funciona, vamos seguir passo a passo como o bash completou esta expansão. Primeiro, ele começou procurando por substrings no início de "foodforthought.jpg" que combinam com a expressão "*fo". Aqui estão as substrings que ele checou:
f fo Combina com *fo foo food foodf foodfo Combina com *fo foodfor foodfort foodforth foodfortho foodforthou foodforthoug foodforthough foodforthought foodforthought. foodforthought.j foodforthought.jp foodforthought.jpg
Após procurar por combinações na string, você pode ver que o bash encontrou duas combinações. Ele seleciona a maior combinação, remove ela do início da string original, e retorna o resultado.
A segunda forma de expansão de variável apresentada acima parece ser idêntica à primeira, exceto que ela usa somente um "#" -- e o bash faz um processo quase idêntico. Ele checa o mesmo conjunto de substrings que o nosso primeiro exemplo fez, exceto que ele remove a combinação menor de nossa string original, e retorna o resultado. Assim, logo que ele encontra a substring "fo", ele a remove de nossa string e retorna "odforthought.jpg".
Isto pode parecer extremamente críptico, de forma que eu vou mostrar uma forma simples de lembrar esta funcionalidade. Quando estiver procurando pela maior combinação, use ## (por que ## é maior que #). Quando estiver procurando pela combinação mais curta, use #. Como vemos, não é difícil de lembrar! Espere, como você vai lembrar que o caracter "#" é usado para remover do "início" de uma string? Simples! você deve notar que em um teclado US, o Shift-4 é o "$", que é o caracter de expansão de variável. No teclado, imediatamente na esquerda do "$" está o "#". Assim, voc~e pode ver que o "#" está "no início" de "$", e assim (de acordo com nosso mneumônico), o "#" remove caracteres do início da string. Você pode estar se perguntando como removemos caracteres do fim da string. Se você "chutar" que usamos o caracter imediatamente à direita do "$" no teclado US ("%"), você acertou! Aqui tem alguns rápidos exemplso de como cortar porções finais de strings:
$ MYFOO="chickensoup.tar.gz" $ echo ${MYFOO%%.*} chickensoup $ echo ${MYFOO%.*} chickensoup.tarComo você pode ver, as opções de expansão de variável % e %% funcionam de forma idêntica ao # e ##, exceto que removem a substring que combina no fim da string. Note que vicê não precisa usar o "*" se você quer remover uma substring específica do fim:
$ MYFOOD="chickensoup" $ echo ${MYFOOD%%soup} chickenNeste exemplo, não importa se usamos o "%%" ou o "%", uma vez que somente uma combinação é possível. E lembre-se, se você esquecer se deve usar o "#" ou o "%", olhe para as teclas 3, 4 e 5 no seu teclado e descubra por si.
Podemos usar outra forma de expansão de variável para selecionar uma substring específica, baseado em um deslocamento e comprmento de caracteres específicos. Tente escrever as seguintes linhas no bash:
$ EXCLAIM=cowabunga $ echo ${EXCLAIM:0:3} cow $ echo ${EXCLAIM:3:7} abungaEsta forma de cortar strings é bastante útil. Basta especificar o carcter a partir do qual iniciar e o comprimento da substring, todos separados por dois pontos.
Aplicando o corte de strings
Agora que aprendemos tudo sobre cortar strings, vamos escrever um pequeno script shell simples. Nosso script irá aceitar um nome de arquivo como argumento, e vai imprimir se ele parece ser um tarball. Para determinar se é um tarball, ele vai procurar pelo padrão ".tar" no fim do arquivo. Aqui está o script:
mytar.sh -- um script de exemplo
#!/bin/bash if [ "${1##*.}" = "tar" ] then echo This appears to be a tarball. else echo At first glance, this does not appear to be a tarball. fiPara executar este script, entre o mesmo em um arquivo chamado mytar.sh, e execute o comando "chmod 755 mytar.sh" para torná-lo executável. A seguir, tente o mesmo com um tarball, conforme segue:
$ ./mytar.sh thisfile.tar This appears to be a tarball. $ ./mytar.sh thatfile.gz At first glance, this does not appear to be a tarball.
OK, funciona, mas não é muito funcional. Antes que o tornemos um pouco mais útil, vamos dar uma olhada na declaração "if" acima. Nela, temos uma expressão booleana. No bash, o operador de comparação "=" verifica igualdade de strings. No bash, todas expressões booleanas ficam entre colchetes. Mas o que a expressão booleana está testando? Vamos dar uma olhada no lado esquerdo. De acordo com o que aprendemos sobre corte de strings, "${##1*.}" irá remover a combinação mais longa de "*." do início da string contida na variável de ambiente "1", retornando o resultado. Isto fará com que tudo que esteja após o último "." no arquivo será retornado. Obviamente, se o arquivo termina em ".tar", iremos obter "tar" como resultado, e a condição será verdadeira.
Você pode estar se perguntando o que a variável de ambiente "1" é, em primeiro lugar. Muito simples -- $1 é o primeiro argumento da linha de comando do script, $2 é o segundo, etc. OK, agora que já revisamos a função, podemos dar nossa primeira olhada nas declarações "if".
Declaração if
Como a maioria das linguagens, o bash possu sua própria forma de condicional. Quando estiver usando condicionais, use a forma acima, ou seja, coloque o "if" e o "then" em linhas separadas, e coloque o "else" e o "fi" obrigatório em alinhamento horizontal com o "if". Isto faz com que o código seja mais fácil de ler e depurar. Alpem da forma "if, else", existem várias outras formas de declaração "if":
if [ condition ] then action fiEste "if" somente executa uma ação se condition for verdadeiro, senão ele não executa ação alguma e continua executando quaisquer linhas que seguem o "fi".
if [ condition ] then action elif [ condition2 ] then action2 . . . elif [conditionN ] then actionN else actionx fi
A forma "elif" acima irá testar cada condição consecutivamente e executar a ação correspondente à primeira condição verdadeira. Se nenhuma das condições for verdadeira, ele irá executar a ação "else", se houver uma presente, e então continuará executando as linhas que seguem a declaração "if, elif, else".
A próxima vez
Agora que cobrimos a funcionalidade mais básica do bash, é hora de aproveitar o embalo e preparar-se para escrever alguns scripts reais. No próximo artigo, irei cobrir construções de repetição, funções, espaços de nomes, e outros tópicos essenciais. Então estaremos prontos para escrever alguns scripts mais complicados. No terceiro artigo, iremos nos concentrar quase exclusivamente em um script bastante complexo e funções, bem como várias opções de projeto de scripts bash. Até lá!
Recursos
- Visite a página do bash GNU
- Confira o manual de referência on line do bash
Sobre o autor
Residindo em Albuquerque, Novo México, Daniel Robbins é o Chief Architect do Gentoo Project, CEO da Gentoo Technologies, Inc., o mentor do Linux Advanced Multimedia Project (LAMP), e um autor-contribuinte dos livros da Macmillan Caldera OpenLinux Unleashed, SuSE Linux Unleashed, e Samba Unleashed. Daniel está envolvido com computadores de alguma forma desde o segundo grau, quando ele foi exposto pela primeira vez à linguagem de programação Logo, bem como a uma dose podencialmente perigosa de Pac Man. Isto provavelmente explica por que ele tem servido desde então como Lead Graphic Artist na SONY Eletronic Publishing/Psygnosis. Daniel gosta de passar o tempo com sua esposa, Mary, que está esperando uma criança para esta primavera. Ele pode ser encontrado no email drobbins@gentoo.org.