Skip to content

tuxmarrento/bash-guide_pt-br

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

111 Commits
 
 
 
 
 
 

Repository files navigation

bash logo

Índice

  1. Operações Básicas
    1.1. Operações com Arquivo
    1.2. Operações com Texto
    1.3. Operações com Diretório
    1.4. SSH, Informações do Sistema & Operações de Rede
    1.5. Operações de Monitoramento de Processos
  2. Programação Básica com Shell
    2.1. Variáveis
    2.2. Array
    2.3. Manipulação de String
    2.4. Outros Truques com Strings
    2.5. Funções
    2.6. Condicionais
    2.7. Loops
    2.8. Regex
    2.9. Pipes
  3. Truques
  4. Depuração

1. Operações Básicas

a. export

O comando export mostra todas as variáveis de ambiente. Caso você queira obter detalhes de uma variável específica, use echo $NOME_DA_VARIAVEL.

export

Exemplo:

$ export
AWS_HOME=/Users/tuxmarrento/.aws
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LESS=-R

$ echo $AWS_HOME
/Users/tuxmarrento/.aws

b. whatis

O comando whatis mostra a descrição dos comandos de usuário, system calls, funções de biblioteca e outros, extraídos das páginas de manual.

whatis alguma_coisa

Exemplo:

$ whatis bash
bash (1)             - GNU Bourne-Again SHell

c. whereis

O comando whereis busca por executáveis, source files e páginas de manual, usando uma base de dados construída pelo sistema automaticamente.

whereis nome

Exemplo:

$ whereis php
/usr/bin/php

d. which

O comando which busca por executáveis nos diretórios especificados pela variável de ambiente PATH. Este comando vai mostrar o caminho completo do(s) executável(eis).

which nome_do_programa

Exemplo:

$ which php
/c/xampp/php/php

e. clear

O comando clear limpa o conteúdo da janela.

1.1. Operações com Arquivo

cat chmod chown cp diff file find gzip gzcat gunzip head
less lpq lpr lprm ls more mv rm tail touch

a. cat

O comando cat pode ser usado, no UNIX ou no Linux, para os seguintes propósitos:

  • Imprimir arquivos de textos na tela;
  • Copiar arquivos de texto;
  • Combinar arquivos de texto;
  • Criar novos arquivos de texto.
cat nome_do_arquivo
cat arquivo1 arquivo2 
cat arquivo1 arquivo2 > nome_do_arquivo_combinado
cat < arquivo1 > arquivo2 #copia o arquivo1 para o arquivo2

b. chmod

O comando chmod, acrônimo para "change mode" (alterar modo), permite que você altere as permissões de leitura, escrita e execução dos seus arquivos e pastas. Para mais informações a respeito desse comando, acesse este link.

chmod -opcoes nome_do_arquivo

c. chown

O comando chown, acrônimo para "change owner" (alterar proprietário), permite que você altere o proprietário de um determinado arquivo ou pasta, o qual pode ser um usuário ou um grupo. O uso básico é simples: primeiro vem o usuário (proprietário) e depois o grupo, delimitado por dois pontos.

chown -opcoes usuario:grupo nome_do_arquivo

d. cp

O comando cp copia um arquivo de um local para outro.

cp nome_do_arquivo1 nome_do_arquivo2

Em que nome_do_arquivo1 é o caminho do arquivo original e nome_do_arquivo2 é o caminho para o destino da cópia do arquivo.

e. diff

O comando diff compara arquivos e lista suas diferenças.

diff nome_do_arquivo1 nome_do_arquivo2

f. file

O comando file determina o tipo do arquivo.

file nome_do_arquivo

Exemplo:

$ file index.html
 index.html: HTML document, ASCII text

g. find

O comando find encontra arquivos no diretório.

find diretorio opcoes parametro

Exemplo:

$ find . -name README.md
$ find /home/user1 -name '*.png'

h. gzip

O comando gzip compacta arquivos.

gzip nome_do_arquivo

i. gzcat

O comando gzcat permite verificar o conteúdo no arquivo compactado pelo gzip sem precisar descompactá-lo.

gzcat nome_do_arquivo

j. gunzip

O comando gunzip descompacta arquivos compactados pelo gzip.

gunzip nome_do_arquivo

k. head

O comando head exibe as primeiras 10 linhas de um arquivo.

head nome_do_arquivo

l. less

O comando less exibe o conteúdo de um arquivo, ou da saída de um comando, em uma página por vez. Ele é similar ao more, mas possui recursos mais avançados, permitindo navegar tanto para frente quanto para trás, através do arquivo.

less nome_do_arquivo

m. lpq

O comando lpq exibe a fila de impressão.

lpq

Exemplo:

$ lpq
Rank    Owner   	Job     File(s) 	Total Size
active  tuxmarrento 	59      README.md 	399360 bytes
1st     tuxmarrento 	60      (stdin) 	0 bytes

n. lpr

O comando lpr imprime um arquivo.

lpr nome_do_arquivo

o. lprm

O comando lprm remove algo da fila de impressão, usando o "número" (ID) do trabalho verificado na coluna "job" do comando lpq.

lprm id_do_trabalho

p. ls

O comando ls lista o conteúdo de um diretório. lspossui várias opções: -l lista os arquivos em formato estendido, o qual contém o tamanho exato do arquivo, o proprietário, quem tem a permissão para vê-lo e quando foi a última modificação; -a lista todos os arquivos, incluindo os ocultos. Para mais informações a respeito desse comando, acesse este link.

ls opcao

Exemplo:

$ ls -la
rwxr-xr-x   33 tuxmarrento  staff    1122 Mar 27 18:44 .
drwxrwxrwx  60 tuxmarrento  staff    2040 Mar 21 15:06 ..
-rw-r--r--@  1 tuxmarrento  staff   14340 Mar 23 15:05 .DS_Store
-rw-r--r--   1 tuxmarrento  staff     157 Mar 25 18:08 .bumpversion.cfg
-rw-r--r--   1 tuxmarrento  staff    6515 Mar 25 18:08 .config.ini
-rw-r--r--   1 tuxmarrento  staff    5805 Mar 27 18:44 .config.override.ini
drwxr-xr-x  17 tuxmarrento  staff     578 Mar 27 23:36 .git
-rwxr-xr-x   1 tuxmarrento  staff    2702 Mar 25 18:08 .gitignore

q. more

O comando more exibe a primeira parte de um arquivo (mova a exibição com a tecla de espaço e digite "q" para sair). É uma versão mais antiga e simplificada do less, visto acima.

more nome_do_arquivo

r. mv

O comando mv move um arquivo de um lugar para outro..

mv nome_do_arquivo1 nome_do_arquivo2

Em que nome_do_arquivo1 é o caminho do arquivo original e nome_do_arquivo2 o caminho para o destino do arquivo.

O comando mv também pode ser usado para renomear um arquivo.

mv nome_antigo novo_nome

Em que nome_antigo é o caminho do arquivo e novo_nome é o novo nome com o mesmo caminho para o arquivo; caso a linha de comando esteja executando no diretório onde está o arquivo, basta usar somente o nome, dispensando o caminho.

s. rm

O comando rm remove o arquivo. O uso desse comando com um diretório retorna um erro: rm: diretorio: is a directory Para remover um diretório, deve-se acrescentar a opção -r, a qual remove o conteúdo do diretório recursivamente. Opcionalmente, pode-se usar a flag -f para forçar a exclusão, i.e., sem quaisquer confirmações etc.

rm nome_do_arquivo

t. tail

O comando tail exibe as últimas 10 linhas de um arquivo. Use -f para exibir os dados apensados (appended: anexados ao final), à medida em que o arquivo cresce.

tail nome_do_arquivo

u. touch

O comando touch atualiza registros de data e hora de acesso e modificação do seu arquivo. Se o arquivo não existir, ele será criado.

touch nome_do_arquivo

Exemplo:

$ touch trick.md

1.2. Operações com Texto

awk cut echo grep egrep fgrep fmt nl sed sort
tr uniq wc

a. awk

O comando awk é o comando mais útil para manipular arquivos de texto. Ele opera em um arquivo inteiro, linha por linha. Por padrão, ele usa espaçoes em branco para separar os campos. A sintaxe mais comum para o comando awk é:

awk '/parametro_de_busca/ { operacao_a_se_realizar_se_o_parametro_for_confirmado; }' arquivo_para_analisar

Para fins de exemplo, vamos pegar o seguinte arquivo /etc/passwd. Aqui estão os dados de amostra que este arquivo contém:

root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

Então, agora vamos usar um comando para extrair somente o nome de usuário a partir desse arquivo, em que -F especifica a base onde nós vamos separar os campos. No nosso caso, é :. O trecho { print $1 } significa extrair o campo correspondente.

awk -F':' '{ print $1 }' /etc/passwd

Depois de executar o comando acima, você vai obter a seguinte saída:

root
daemon
bin
sys
sync

Para mais detalhes a respeito do uso de awk, acesse o link.

b. cut

O comando cut remove seções de cada linha de arquivos.

exemplo.txt

o garoto de gorro vermelho foi ao parque brincar

exibir as colunas 2, 6, e 9 com espaço como separador

cut -d " " -f2,6,9 exemplo.txt
garoto foi brincar

c. echo

O comando echo exibe uma linha de texto.

exibir "Olá, Mundo"

echo Olá, Mundo
Olá, Mundo!

exibir "Olá, Mundo" com novas linhas entre as palavras

echo -ne "Olá,\nMundo\n"
Olá,
Mundo

d. grep

O comando grep procura texto dentro dos arquivos. Pode-se usá-lo para buscar linhas de texto equivalentes a uma ou mais expressões regulares e extrair somente as linhas correspondentes.

grep parametro nome_do_arquivo

Exemplo:

$ grep admin /etc/passwd
_kadmin_admin:*:218:-2:Kerberos Admin Service:/var/empty:/usr/bin/false
_kadmin_changepw:*:219:-2:Kerberos Change Password Service:/var/empty:/usr/bin/false
_krb_kadmin:*:231:-2:Open Directory Kerberos Admin Service:/var/empty:/usr/bin/false

Pode-se forçar o grep a ignorar maiúsculas, usando a opção -i. Com -r, pode-se buscar todos os arquivos dentro de um diretório específico, por exemplo:

$ grep -r admin /etc/

E a opção -w pode ser usada para buscar somente palavras. Para mais detalhes a respeito do comando grep, acesse o link.

e. egrep

O comando egrep imprime na tela as linhas correspondentes a um parâmetro - Expressão Estendida (alias para: 'grep -E')

exemplo.txt

Lorem ipsum
dolor sit amet, 
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

exiba as linhas que contenham "Lorem" ou "dolor".

egrep '(Lorem|dolor)' exemplo.txt

ou

grep -E '(Lorem|dolor)' exemplo.txt
Lorem ipsum
dolor sit amet,
et dolore magna
duo dolores et ea
sanctus est Lorem
ipsum dolor sit

f. fgrep

O comando fgrep imprime na tela as linhas que correspondam a um parâmetro, exibindo o parâmetro correspondente fixado (alias para: 'grep -F')

exemplo.txt

Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
foo (Lorem|dolor) 
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

Econtre a exata string '(Lorem|dolor)' em exemplo.txt

fgrep '(Lorem|dolor)' exemplo.txt

ou

grep -F '(Lorem|dolor)' exemplo.txt
foo (Lorem|dolor) 

g. fmt

O comando fmt é um ótimo formatador simples de texto.

exemplo.txt (com uma única linha)

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

edite as linhas de exemplo.txt para o comprimento de 20 caracteres

cat exemplo.txt | fmt -w 20
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

h. nl

O comando nl enumera linhas de arquivos.

exemplo.txt

Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

mostre exemplo.txt com linhas numeradas

nl -s". " exemplo.txt 
     1. Lorem ipsum
     2. dolor sit amet,
     3. consetetur
     4. sadipscing elitr,
     5. sed diam nonumy
     6. eirmod tempor
     7. invidunt ut labore
     8. et dolore magna
     9. aliquyam erat, sed
    10. diam voluptua. At
    11. vero eos et
    12. accusam et justo
    13. duo dolores et ea
    14. rebum. Stet clita
    15. kasd gubergren,
    16. no sea takimata
    17. sanctus est Lorem
    18. ipsum dolor sit
    19. amet.

i. sed

O comando sed é um editor de fluxo que filtra e transforma o texto.

exemplo.txt

Olá isso é um teste 1 2 3 4

substitua todos os espaçoes por hífens

sed 's/ /-/g' exemplo.txt
Olá-isso-é-um-teste-1-2-3-4

substitua todos os dígitos por "d"

sed 's/[0-9]/d/g' exemplo.txt
Olá isso é um teste d d d d

j. sort

O comando sort organiza as linhas de arquivos de texto.

exemplo.txt

f
b
c
g
a
e
d

organize exemplo.txt

sort exemplo.txt
a
b
c
d
e
f
g

randomize um exemplo.txt organizado

sort example.txt | sort -R
b
f
a
c
d
g
e

k. tr

O comando tr substitui ou deleta caracteres.

exemplo.txt

Olá Mundo Foo Bar Baz!

substitua todas as minúsculas por maiúsculas

cat exemplo.txt | tr 'a-z' 'A-Z' 
OLÁ MUNDO FOO BAR BAZ!

substitua todos os espaços por novas linhas

cat exemplo.txt | tr ' ' '\n'
Olá
Mundo
Foo
Bar
Baz!

l. uniq

O comando uniq sinaliza ou omite linhas repetidas.

exemplo.txt

a
a
b
a
b
c
d
c

mostre somente uma linha de cada repetição de linhas em exemplo.txt (primeiro você precisa organizá-lo, caso contrário ele não encontrará as repetições)

sort exemplo.txt | uniq
a
b
c
d

usando a opção -c ou --count, mostre somente uma linha de cada repetição de linhas e diga quantas ocorrências delas foram encontradas

sort exemplo.txt | uniq -c
    3 a
    2 b
    2 c
    1 d

outras opções para o comando uniq são:

  • -d ou --repeated: Exibe somente linhas que são repetidas;
  • -i ou --ignore-case: Ignora maiúsculas ao comparar as linhas;
  • -u ou --unique: Exibe somente as linhas sem repetição;

m. wc

O comando wc conta a quantidade de linhas, palavras e caracteres existente em um arquivo.

wc nome_do_arquivo

Exemplo:

$ wc exemplo.txt
7459   15915  398400 exemplo.txt

Onde 7459 é o total de linhas, 15915 é o total de palavras e 398400 é o total de caracteres.

Pode-se ainda filtrar a saída por opções:

  • -c ou --bytes: imprime na tela o número de bytes;
  • -m ou --chars: imprime na tela o número de caracteres;
  • -l ou --lines: imprime na tela o número de linhas;
  • -w ou --words: imprime na tela o número de palavras;

1.3. Operações com Diretório

cd mkdir pwd

a. cd

O comando cd muda de um diretório para outro.

$ cd

move para o diretório HOME. Esse comando aceita um nome opcional, o qual pode ser o caminho para esse diretório, mudando você para ele.

cd nome_do_diretorio

Mude para o diretório anterior:

cd -

Mude para o diretório acima:

cd ..

b. mkdir

O comando mkdir cria um novo diretório.

mkdir nome_do_diretorio

Pode-se usá-lo para criar múltiplos diretórios de uma só vez dentro do diretório corrente.

mkdir nome_do_diretorio1 nome_do_diretorio2 nome_do_diretorio3

Também pode-se usá-lo para criar uma árvore de diretórios — com diretórios "pais" como subdiretórios — ao mesmo tempo, com a opção -p ou --parents. Por exemplo, caso você queira criar um diretório chamado "projeto1" dentro de um novo subdiretório em "/exemplos/bash/projetos/", você poderia executar:

mkdir -p /exemplos/bash/projetos/projeto1

ou

mkdir --parents /exemplos/bash/projetos/projeto1

Caso qualquer um dos diretórios nessa árvore de diretórios não exista, ele será criado também.

c. pwd

Imprime na tela em qual diretório você está no momento.

pwd

1.4. SSH, Informações do Sistema & Operações de Rede

bg cal date df dig du fg finger jobs last
man passwd ping ps quota scp ssh top uname uptime
w wget whoami whois sync curl

a. bg

O comando bg lista trabalhos parados ou em backdround; reinicia um trabalho parado em segundo plano (background).

b. cal

O comando cal mostra o calendário do mês.

c. date

O comando date mostra o dia e a hora correntes.

d. df

O comando df mostra o uso do disco.

e. dig

O comando dig obtém a informação DNS para um domínio.

dig dominio.com

f. du

O comando du mostra o uso de disco por um arquivo ou diretório. Para mais informações a respeito do comando du, acesse o link

du opcao arquivo|diretorio

Algumas opções:

  • -h (leitura humanizada) mostra as informações em kilobytes (K), megabytes (M) ou gigabytes (G).
  • -s (supresso ou sumarizado) mostra o uso total de disco por um diretório e suprime informações de subdiretórios. Exemplo:
du -sh imagens
1.4M imagens

g. fg

O comando fg exibe o trabalho mais recente em primeiro plano (foreground).

h. finger

O comando finger mostra informações sobre o usuário

finger usuario

i. jobs

O comando jobs lista os trabalhos que estão executando no segundo plano e indica o número (ID) do trabalho.

j. last

O comando last lista os últimos logins de um usuário específico.

last nomeDeUsuario

k. man

O comando man exibe o manual de um determinado comando.

man comando

l. passwd

O comando passwd permite mudar a senha do usuário logado.

m. ping

O comando ping realiza o ping para o endereço indicado e mostra os resultados.

ping host

n. ps

O comando ps lista os processos em atividade. Com a opção -u, pode-se filtrar por usuário, ao indicá-lo:

ps -u nomeDeUsuario

Use as flags -ef: e para todos os processos e f para lista completa.

ps -ef

o. quota

O comando quota mostra qual a sua cota de uso de disco.

quota -v

p. scp

O comando scp permite a transferência de arquivos entre um host local e um host remoto; ou entre dois hosts remotos.

copiar de um host local para um host remoto

scp arquivo_original usuario@host:diretorio/arquivo_alvo

copiar de um host remoto para um host local

scp usuario@host:diretorio/arquivo_original arquivo_alvo

para diretórios, como o -cp

scp -r usuario@host:diretorio/diretorio_original diretorio_alvo

Esse comando também aceita uma opção -P que pode ser usada para conectar a uma porta específica.

scp -P porta usuario@host:diretorio/arquivo_original arquivo_alvo

q. ssh

O ssh (SSH client) é um programa para conectar-se e executar comandos em uma máquina remota.

ssh usuario@host

Esse comando também aceita uma opção -p que pode ser usada para conectar a uma porta específica.

ssh -p porta usuario@host

r. top

O comando top exibe os processos ativos no sistema.

s. uname

O comando uname exibe as informações do kernel.

uname -a

t. uptime

O comando uptime exibe o tempo corrente de atividade.

u. w

O comando w exibe quem está logado. Com a sintaxe w opcoes usuario, pode-se:

  • -h ou --no-header: suprimir a informação do cabeçalho, mostrando apenas os detalhes do usuário;
  • -s ou --short: exibir uma saída de formato curto, omitindo o tempo de login, as colunas JCPU e PCPU;
  • -u ou --no-current: ignorar o processo atual, ver o tempo ocioso e o que o usuário está fazendo;
  • -i ou --ip-addr: forçar a exibição de endereços IP, em vez de nomes de host, no campo FROM;
  • -o ou --old-style: usar o formato de saída antigo, imprimindo na tela espaços em branco para tempos ociosos inferiores a um minuto.

v. wget

O comando wget baixa um arquivo.

wget arquivo

w. whoami

O comando whoami retorna o usuário atualmente logado.

x. whois

O comando whois obtém a informação whois para um domínio.

whois dominio

y. rsync

O comando rsync faz o mesmo trabalho do comando scp, mas transfere somente arquivos modificados. Muito útil quando se transfere o mesmo diretório para ou de um sevidor várias vezes.

rsync diretorio_original usuario@host:diretorio_alvo
rsync usuario@host:diretorio_original diretorio_alvo

z. curl

Curl é uma ferramenta em linha de comando para requisitar ou enviar dados usando sintaxe URL. Muito útil para sistemas em que você tem somente um terminal disponível para fazer várias requisições.

curl url

Algumas opções são:

  • -X ou --request para especificar qual método você gostaria de invocar (GET, POST, DELETE, ...);
  • -d <dados> ou --data <dados> para dados de POST request em um determinado URL.

1.5. Operações de Monitoramento de Processos

kill killall &; nohup

a. kill

O comando kill encerra o processo usando o PID (Process IDentifier) que você informa.

kill PID

b. killall

O comando killall encerra todos os processos com o nome.

killall nomeDoProcesso

c. &

O símbolo & instrui o comando a executar como um processo em segundo plano num subshell.

comando &

d. nohup

nohup significa "No Hang Up". Ele permite executar comandos, processos ou scripts que podem continuar sendo executados em segundo plano após você sair de um shell.

nohup comando

Combine-o com & para criar processos em segundo plano.

nohup comando &

2. Programação Básica com Shell

A primeira linha que você vai escrever em um arquivo com script bash se chama shebang. Em qualquer script, essa linha determina qual interpretador será utilizado para rodar o executável sem precisar digitar sh, bash, python, php etc. previamente no terminal.

#!/usr/bin/env bash

Este modelo acima utiliza env com a finalidade de localizar o interpretador Bash através da variável de ambiente $PATH, sem precisar especificar o caminho exato. Ao especificar o caminho em absoluto — com #!/usr/bin/bash — reduz-se a portabilidade do script, enquanto usar env previne erros que podem decorrer de alguma alteração de localização ou de nome do executável Bash.

2.1. Variáveis

Criar variáveis com Bash é similar a outras linguagens. Não existem tipos de dados. Uma variável em Bash pode conter um número, um caracter, uma string de caracteres etc.. Não é necessário declarar uma variável, bastando assinalar um valor para que a sua referência seja criada.

Exemplo:

str="Olá, Mundo"

A linha acima cria uma variável str e assinala "Olá, Mundo" como valor para ela. O valor da variável é referenciado colocando um $no início do nome da variável. Exemplo:

echo $str

Saída:

Olá, Mundo

2.2. Array

Assim como outras linguagens, o Bash também possui arrays. Um array é uma variável que contém múltiplos valores. Não existe um limite máximo para o tamanho do array. Em Bash, o primeiro elemento de um array é indexado como elemento 0. Existem muitas formas para criar arrays em Bash, conforme a seguir.

Exemplos:

array[0]=val
array[1]=val
array[2]=val
array=([2]=val [0]=val [1]=val)
array=(val val val)

Para exibir um valor de um índice específico, use a seguinte sintaxe:

${array[i]}     # em que i é o índice

Se nenhum índice for fornecido, o elmento 0 do array é assumido. Para saber quantos valores exisetem no array, use a seguinte sintaxe:

${#array[@]}

O Bash também oferece suporte a condições ternárias. Veja alguns exemplos:

${varname:-word} 		# se o varname existe e não for nulo, retorna o seu valor; caso contrário, retorna word.
${varname:=word} 		# se o varname existe e não for nulo, retorna o seu valor; caso contrário, define-o como word e retorna o seu valor.
${varname:+word} 		# se o varname existe e não for nulo, retorna o seu valor; caso contrário, returna null.
${varname:offset:length} 	# realiza a expansão de substring. Retorna a substring de $varname, começando no ponto de expansão e indo até o final dos caracteres.

2.3 Manipulação de String

Veja algumas das formas de sintaxe para manipular strings:

${variavel#parametro} 		# se o parâmetro corresponder ao início do valor da variável, exclui a parte mais curta que corresponde e retorna o restante.
${variavel##parametro} 		# se o parâmetro corresponder ao início do valor da variável, exclui a parte mais longa que corresponde e retorna o restante.
${variavel%parametro} 		# se o parâmetro corresponder ao final do valor da variável, exclui a parte mais curta que corresponde e retorna o restante.
${variavel%%parametro} 		# se o parâmetro corresponder ao final do valor da variável, exclui a parte mais longa que corresponde e retorna o restante.
${variavel/parametro/string} 	# a correspondência com o parâmetro mais longa na variável é substituída pela string. Apenas a primeira correspondência é substituída.
${variavel//parametro/string} 	# a correspondência com o parâmetro mais longa na variável é substituída pela string. Todas as correspondências são substituídas.
${#varname} 			# retorna o comprimento do valor da variável como uma sequência de caracteres.

2.4. Outros Truques com Strings

O Bash oferece vários truques de atalho para fazer diversas coisas com strings.

${variavel,,} 		# isso converte todas as letras da variável em minúsculas.
${variavel^^} 		# isso converte todas as letras da variável em maiúsculas.

${variavel:2:8} 	# isso retorna uma substring de uma string, começando no caractere de índice 2 (strings começam no índice 0, como explicitado acima, então esse é o terceiro caractere); a substring terá 8 caracteres, então isso retornaria uma string composta do 3º ao 11º caractere.

Aqui estão alguns truques úteis para combinar parâmetros:

if [[ "$variavel" == *subString* ]]  	# isso retorna true se a subString fornecida estiver na variável.
if [[ "$variavel" != *subString* ]]  	# isso retorna true se a subString fornecida não estiver na variável.
if [[ "$variavel" == subString* ]]   	# isso retorna true se a variável começa com a subString fornecida.
if [[ "$variavel" == *subString ]]   	# isso retorna true se a variável termina com a subString fornecida.

O truque acima pode ser encurtado usando uma instrução case e a palavra-chave INT:

case "$var" in
	inicio*)
		# a variável começa com "inicio"
	;;
	*subString*)
		# a subString está na variável
	;;

	*outraSubString*)
		# uma outraSubString está na variável
	;;
esac

2.5. Funções

Como em quase toda linguagem de programação, você pode usar funções para agrupar trechos de código de forma mais lógica ou praticar a divina arte da recursão. Declarar uma função é apenas uma questão de escrever function minha_func { meu_codigo }. Chamar uma função é como chamar outro programa: basta escrever o nome dela.

function nome() {
    comandos shell
}

Exemplo:

#!/bin/bash
function ola {
   echo mundo!
}
ola

function diga {
    echo $1
}
diga "ola mundo!"

Ao executar o exemplo acima, a função ola retornará "mundo!". As duas funções ola e diga acima são estruturalmente idênticas. A principal diferença é que a função diga imprime o primeiro argumento recebido. Argumentos, dentro de funções, são tratados da mesma maneira que argumentos fornecidos ao script.

2.6. Condicionais

A instrução condicional em Bash é similar a outras linguagens de programação. As condições têm muitas formas, como a mais básica: a expressão if seguida da instrução then, em que a instrução só é executada se a expressão for verdadeira.

if [ expressao ]; then
    será executado somente se a expressao for true
else
     será executado se a expressao for false
fi

Às vezes, as condições se tornam confusas, então você pode escrever a mesma condição usando as instruções case.

case expressao in
    parametro1 )
        instrucoes ;;
    parametro2 )
        instrucoes ;;
    ...
esac

Exemplos de expressão:

instrucao1 && instrucao2 	# ambas instruções são true
instrucao1 || instrucao2 	# ao menos uma instrução é true

str1=str2       # str1 corresponde à str2
str1!=str2      # str1 não corresponde à str2
str1<str2       # str1 é menor que str2
str1>str2       # str1 é maior que str2
-n str1         # str1 é não nula (tem um comprimento maior que 0)
-z str1         # str1 é nula (tem comprimento 0)

-a arquivo         # o arquivo existe
-d arquivo         # o arquivo existe e é um diretório
-e arquivo         # o arquivo existe; o mesmo que -a
-f arquivo         # o arquivo existe e é regulare (i.e., não é um diretório ou outro tipo especial de arquivo)
-r arquivo         # você tem permissão de leitura
-s arquivo         # o arquivo existe e não está vazio
-w arquivo         # você tem permissão de escrita
-x arquivo         # você tem permição de execução do arquivo, ou permissão de busca pelo diretório, caso seja um
-N arquivo         # o arquivo foi modificado desde a última leitura
-O arquivo         # seu próprio arquivo
-G arquivo         # o ID de grupo do arquivo corresponde ao seu

arquivo1 -nt arquivo2     # arquivo1 é mais novo do que o arquivo2
arquivo1 -ot arquivo2     # arquivo1 é mais velho do que o arquivo2

-lt     # menor que
-le     # menor que ou igual a
-eq     # igual a
-ge     # maior que ou igual a
-gt     # maior que
-ne     # não igual a

2.7. Loops

Existem três tipos de Loop em Bash. for, while e until.

Sintaxe for:

for nome in [lista]
do
  instrucoes que podem usar $nome
done

ou ainda:

for (( inicializacao ; condicao final ; atualizacao ))
do
  instrucoes
done

Sintaxe de while:

while condicao; do
  instrucoes
done

Sintaxe de until:

until condicao; do
  instrucoes
done

2.8. Regex

Existe uma ferramenta poderosa para manipular e buscar texto. Aqui estão alguns exemplos de expressões regulares que usam cada metacharacter:

`.` ponto `*` asterisco `+` plus `?` interrogação `|` pipe `[]` classe caracter `[^]` classe caracter recusado `()` agrupamento `{}` quantificador `\` escape

a. . ponto

Corresponde a qualquer caracter, exceto uma nova linha.

grep h.t arquivo.txt

Saída:

hat
hot
hit

b. * asterisco

Corresponde a zero ou mais ocorrências do caracter ou grupo precedente.

grep ab*c arquivo.txt

Saída:

ac
abc
abbc
abbbc

c. + plus

Corresponde a uma ou mais ocorrências do caracter ou grupo precedente.

grep ab+c arquivo.txt

Saída:

abc
abbc
abbbc
abbbbc

d. ? interrogação

Corresponde a zero ou uma ocorrência do caracter ou grupo precedente.

grep ab?c arquivo.txt

Saída:

ac
abc

e. | pipe

Corresponde ao parâmetro à esquerda ou ao parâmetro à direita.

egrep "gato|cachorro" arquivo.txt

Saída:

gato
cachorro

f. [] classe caracter

Corresponde a quaisquer caracteres que estão entre os colchetes.

[aeiou] 	# vai corresponder a qualquer vogal
[a-z] 		# vai corresponder a qualquer letra minúscula

g. [^] classe caracter recusado

Corresponde a quaisquer caracteres que não estão entre os colchetes.

[^aeiou] 	# vai corresponder a qualquer consoante
[^a-z] 		# vai corresponder a qualquer caracter que não seja letra minúscula

h. () agrupamento

Agrupa vários tokens juntos e cria um grupo de captura.

egrep "(ab)+" arquivo.txt

Saída:

ab
abab
ababab

i. {} quantificador

Corresponde a um número específico de ocorrências de um caracter ou grupo precedente.

egrep "a{3}" arquivo.txt

Saída:

aaa
aaaa
aaaaa

j. \ escape

Remove o significado especial no Bash do próximo caractere para preservar seu valor literal, exceto para o caracter n, com o qual cria uma nova linha na combinação \n.

egrep "a\+" arquivo.txt

Saída:

a+

Mais detalhes a respeito do escape podem ser encontrados no link

2.9. Pipes

Vários comandos podem ser vinculados um ao outro através de um pipe, |. Um | enviará a saída padrão (standard-output) do comando A para a entrada padrão (standard-input) do comando B.

Os pipes também podem ser usados com os símbolos |&. Essa combinação enviará o standard-output e o erro padrão (standard-error) do comando A para o standard-input do comando B.

3. Truques

Configurar um Alias

Execute nano ~/.bash_profile e adicione a seguinte linha:

alias dockerlogin='ssh www-data@tuxmarrento.local -p2222'  # adiciona seu alias ao arquivo .bash_profile

Ir rapidamente para um diretório específico

Execute nano ~/.bashrc e adicione a seguinte linha:

export hotellogs="/workspace/hotel-api/storage/logs"

Agora você pode executar source ~/.bash_profile e usar o caminho salvo chamando-o como uma variável:

source ~/.bashrc
cd $hotellogs

Execute novamente o comando anterior

Isso remonta ao tempo em que ainda não se podia confiar na tecla de seta para cima, mas ainda pode ser útil para executar o último comando do seu histórico.

!!

Um erro comum é esquecer de usar sudo como prefixo de um comando que requer execução privilegiada. Em vez de digitar o comando inteiro novamente, você pode:

sudo !!

Isso corrigiria um mkdir qualquerdir com sudo mkdir qualquerdir.

Saia de armadilhas

Torne seus scripts bash mais robustos realizando limpezas de forma confiável.

function final {
  # sua limpeza aqui; por exemplo, encerrar qualquer fork de processo
  jobs -p | xargs kill
}
trap final EXIT

Salvando as suas variáveis de ambiente

Quando você faz export FOO=BAR, a sua variável é exportada apenas no shell atual e todos os seus filhos. Para persistir em outras sessões, você pode simplesmente anexar ao seu arquivo ~/.bash_profile o comando para exportar suas variáveis.

echo export FOO=BAR >> ~/.bash_profile

Acessando os seus scripts

Você pode acessar os seus scripts facilmente criando um diretório bin em seu diretório home com mkdir ~/bin. Agora, todos os scripts que você colocar nessa pasta poderão ser acessados em qualquer diretório.

Se você não conseguir acessar, tente acrescentar o código abaixo ao seu arquivo ~/.bash_profile e depois execute source ~/.bash_profile.

# defina o PATH para incluir o bin privado do usuário, se existir
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

4. Depuração

Você pode depurar facilmente o script bash passando diferentes opções para o comando bash. Por exemplo:

  • -n não executará comandos e verificará apenas erros de sintaxe;
  • -v mostrará os comandos antes de executá-los;
  • -x mostrará os comandos após o processamento da linha de comando.
bash -n nomeDoScript
bash -v nomeDoScript
bash -x nomeDoScript

Contribuições

  • Identificou algum erro ou problema? Por favor, relate. Saiba como.
  • Abra um pull request com aprimoramentos. Saiba como.
  • Compartilhe!

Guia Original

Outras Traduções

About

Um guia para aprender Bash

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors