Shell Script: Comandos Essenciais no Linux

Linux

Jornada Shell Script: Comandos Linux

Tema Central: Comandos Essenciais do Linux para Programação em Shell Script

Versão 1

Emissão: 16 de julho de 2022

Validade: Indeterminada

Jornada Shell Script: Parte 1

Objetivo Geral da Jornada Shell Script

Muitas pessoas me perguntam como eu me tornei um especialista em Linux, então, à primeira vista, minha resposta é, em geral, muito simples, estudando e praticando.

O uso de shell script é de vital importância para um administrador de sistemas, em especial um especialista Linux, uma vez que abre uma gama de possibilidades que podemos considerar infinitas. Desse modo, saber os Comandos Essenciais no Linux é de vital importância para o SysAdmin.

Então, são muitos os benefícios que um profissional obtém ao aprender essa maravilhosa linguagem de programação. Do mesmo modo, são muitos os benefícios gerados para o negócio quando temos scripts bem estruturados e bem documentos. O tempo que você ganhará e a assertividade nas rotinas repetitivas serão resultados claros. Mas Shell Script não está restrito a isso, um profissional que domina uma linguagem de programação como esta, consegue promover soluções rápidas e acelerar troubleshooting, além de tantas outras facilidades geradas que tentarei pincelar ao longo dessa jornada.

O sentido da Jornada Shell Script é simples, estruturar uma forma completa, mas objetiva, de levar a qualquer um que tiver muita força de vontade e interesse em aprender essa linguagem de programação a criar desde rotinas simples como a de um backup no Linux até programas complexos com loopings e funções configuradas com base em análises e decisões pré-determinadas pelo administrador de sistemas. 

Por fim, espero que este artigo seja útil e mude verdadeiramente sua vida. Nesse ínterim, não deixe de se acompanhar nossos artigos que trarão sempre novidades, atualizações e dicas relevantes para sua carreira. Deixe do mesmo modo seu comentário, seja ele qual for. Sua opinião, pois, será o termômetro para definir o rumo dos próximos projetos que irei priorizar. Bons estudos!

Objetivo deste capitulo de introdução ao Shell Script

Primordialmente, nosso objetivo será capacitar à quem for de interesse na compreensão e execução de comandos essenciais de um sistema operacional Linux.

Cobriremos os comandos Essenciais do Linux para administração e programação em Shell Script

Sobre o Shell Script

Considero o Shell script acima de tudo, uma sequência de comandos, ou instruções lógicas que ao serem devidamente programadas em um sistema operacional Linux auxiliam o administrador de infraestrutura de TI na automação de tarefas, execução de tarefas repetitivas e rotinas, validações de processos, fazendo com que o administrador possa executar com maior eficiência atividades complexas gerando ganhos diretos para o negócio ao qual está envolvido, aumentando a produtividade da equipe e gerando reconhecimento profissional àquele que domina essa linguagem.

Pré-Requisitos Pessoais

Para o bom entendimento e melhor aproveitamento desse artigo, sobretudo, busquei ser o mais direito e simplista possível, tornando o processo de aprendizado livre a qualquer um que queira aprender a programar em Shell, necessário apenas muita força de vontade e esforço para praticar, errar, aprender e melhorar a cada oportunidade de colocar as ideias aqui expostas em prática. Além disso, o conhecimento de alguns termos técnicos em tecnologia da informação é desejado.

Pré-Requisitos Técnicos

Uma maquina virtual (VM) com Uma distribuição de sua preferência com editor de texto vi, padrão na maioria das distribuições Unix. Recomendo o Ubuntu 20.04. 

Introdução ao Shell

Definição

O shell é considerado um interpretador de instruções do linux ou uma interface de comandos e tem como alguns dos seus principais usos:

  • sh → O mais básico dos interpretadores do Linux
  • bash → Interface mais utilizada e nossa referência para este artigo
  • ksh → Mais um tipo de shell com algumas particularidades
  • csh → Shell baseado em linguagem C

Identificando sua interface de comandos no Linux

De maneira simples, desde já citarei alguns comandos que podem ser utilizados para verificar se o interpretador que desejamos está instalado e definido para seu usuário no Linux:

echo $0 #ou
echo $SHELL #Existem na tela do shell qual interface de comandos está sendo utilizada no momento
tail /etc/passwd #O arquivo passwd guarda as informações dos usuários criados no Linux, e nele também podemos ver qual interpretador está definido para o seu usuário. 

Obs.: essa informação é muito importante. Apesar da maior parte das distribuições Linux hoje em dia trazerem o bash como padrão, é comum em ambiente de produção ver usuários criados com o interpretador sh. Uma simples alteração no arquivo passwd de sh para bash facilita, em muito, a vida do administrador.

dpkg -l | grep csh #Lista os pacotes instalados na sua máquina Linux e filtra pela expressão csh

Obs.: fique tranquilo porque vou falar de cada comandos na sequência deste artigo.

apt install csh #Caso deseje instalar um pacote podemos usar no Ubuntu ou Debian o comando apt, nesse exemplo estamos instalando o pacote csh apenas para ilustrar, o csh não será usado na sequência deste artigo.

Comandos básicos Linux

Agora que fizemos as apresentações, vamos ao que interessa, os comandos.

Abaixo deixarei a lista dos comandos mais básicos para que um administrador Linux possa executar a maioria de suas rotinas e atividades corriqueiras.

pwd #Exibe o diretório atual
cd #Entra nos diretórios do sistema
cd ../ #Entra no diretório anterior ao diretório atual
cd – #Ingressa no último diretório acessado, anteriormente ao diretório atual
cd #ou
cd ~ #Acessa o Home do usuário logado. Home é onde ficam os arquivos pessoais do usuário no Linux, podemos mal compará-lo aos meus documentos do windows…
ls #Lista os arquivos e diretórios do sistema
ls -ltr #Lista os arquivos e diretórios ordenando do mais velho para o mais novo
ls -lh #Lista os arquivos e diretórios mostrando o tamanho dos arquivos em formato mais amigável
ls -1 #Mostra de maneira simplificada um arquivo ou diretório por linha no shell
ps #Lista os processos do sistema em execução
ps -aux #Parâmetro mais completo e mais utilizado do ps, onde mostra detalhes dos processos em execução
touch #Cria um arquivo em branco ou altera a data de modificação de um arquivo já existente
echo #Escreve um texto na tela
echo -n #Ignora quebra de linha ao escrever um texto no shell
echo -e #Estende as funções do echo podendo adicionar o parâmetro \t para tabular uma saída de texto ou \n para quebrar a linha do texto
mkdir  #Cria um diretório
mkdir -p #Cria um diretório e subdiretórios recursivamente
rm #Comando de remoção de arquivos
rm -r #Remove diretórios e arquivos recursivamente
rm -f #Ignora erros no comando (por exemplo se um arquivo ou diretório não existir)
sleep #Aguarda um determinado período até que a próxima instrução seja executada
cat #Lê um arquivo de texto
cat -b #Enumera as linhas que não estejam em branco
cat -n #Enumera as linhas mesmo aquelas que estão em branco
cat -A #Exibição de todos os caracteres especiais e ocultos do texto
tac #Leitura de arquivo de texto de modo invertido
tail #Lê por padrão as últimas 10 linhas de um arquivo de texto
tail -n20 #Lê as ultimas 20 linhas de um arquivo de texto, sendo que 20 pode ser substituído para qualquer valor desejado
tail -c50 #Lê os últimos 50 caracteres de um texto, podendo o valor 50 também ser substituído para qualquer valor desejado.
head #Lê por padrão as primeiras 10 linhas de um arquivo de texto
head -n20 #Lê as primeiras 20 linhas de um arquivo de texto, sendo que 20 pode ser substituído para qualquer valor desejado
head -c50 #Lê os primeiros 50 caracteres de um texto, podendo o valor 50 também ser substituído para qualquer valor desejado.
wc #Faz a contagem de Linhas, palavras e caracteres de um arquivo
wc -l #Faz a contagem de linhas de um arquivo
wc -w #Faz a contagem de palavras de um arquivo
wc -c #Faz a contagem de caracteres de um arquivo
wc -b #Faz a contagem de bytes de um arquivo, normalmente coincide com a quantidade de caracteres
Os comandos que seguirão são muitos utilizados com "PIPE", utilizado para direcionar a saída de um comando para outro comando
ex de uso do "|" Pipe:
cat arquivo.txt | wc -l #Lê um arquivo e faz a contagem de linhas no arquivo
sort #Faz a ordenação de um arquivo ou saída de comando. Por padrão a ordenação dar-se-á em string (ordem alfabética)
sort -t #Parâmetro que define um delimitador para os campos (colunas) do texto
sort -k #Define qual campo será utilizado como parâmetro para a ordenação
sort -g #Realiza a ordenação numericamente
sort -r #Reverte a ordenação (maior para menor ou Z para A)
uniq #Comandos para análise de linhas repetidas em uma saída de comando. Muito utilizado com sort uma vez que depende que as repetições estejam na sequência
uniq -u #Exibe as linhas exclusivas de uma saída de comando
uniq -d #Exibe as linhas que se repetem pelo menos uma vez, em sequência, na uma saída de comando
uniq -c #Conta o número de ocorrências e repetições sequenciais de cada linha
tr #Utlizando para substituição de strings
tr a-z A-Z #Transforma toda string de caixa baixa para caixa alta também pode ser usado como [:lower:] [:upper:]
tr " " "\t" #Altera Espaços por tabs, outras substituições como /n são aceitas no tr
tr -d #Deleta caracteres
tr -s #Suprime caracteres repetidos, muito útil para tirar uma sequência de espaços em branco
cut #Comando utilizado para cortar partes de uma saída de comando ou texto
cut -c1-5 #Exibe apenas os 5 primeiros caracteres. Esses valores de 1 à 5 podem ser trocados conforme necessidade
cut -d #Define qual caractere será usado como delimitador de colunas na planilha
cut -f #Seleciona qual coluna (field ou campo) será exibido no recorte da linha
diff #Compara dois arquivos de texto
#A saída < mostra que a diferença está no arquivo da esquerda
#A saída > mostra que a diferença está no arquivo da direita
diff -w #Ignora espaços em branco na comparação dos arquivos
diff -r #Compara diretórios e arquivos recursivamente
grep #Busca de string dentro de um arquivo
#Ao usar o comando grep em vários arquivos ao mesmo tempo (ex: arquivo*), a saída mostrada também o nome do arquivo onde foi encontrada a expressão procurada.
grep -i #Faz busca pela string testando com caixa alta e caixa baixa. Torna a busca mais pesada. grep -c #Conta o número de ocorrências encontradas (similar a função wc -l mas fazendo um filtro antes)
grep -v #Retorna tudo que NÃO contiver a expressão procurada
grep -r #Busca pela string nos arquivos recursivamente, em diretório e subdiretórios
grep -I #Retorna em tela apenas o nome do arquivo e não a linha encontrada
grep -A #Após a string ser encontrada, retornará tudo que vier após a ocorrência
grep -B #Após a string ser encontrada, retornará tudo que vier antes da ocorrência
#VARIAÇÕES DO GREP
fgrep #Mais leve. Não aceita expressões regulares
egrep #Mais pesado, estende as expressões regulares deixando as opções de busca com muito mais possibilidades
sed #Um comando que mistura um pouco das ideias do grep e do tr. Para substituições mais avançadas de strings normalmente o sed é o mais utilizado
sed '1,3 d' #Deleta as linhas de 1 até 3, podendo esses valores de 1 até 3 serem alterados conforme necessidade
sed '/STRING/d' #Deleta a linha toda vez que encontrar a palavra STRING (que poderia ser qualquer palavra)
sed 's/DE/PARA/g' #Substitui as string de DE para PARA (por padrão apenas na primeira ocorrência. Utilizamos o /g para executar a substituição globalmente, ou seja, em todo arquivo ou texto procurado
Podemos elaborar muitas variações com o sed, por exemplo: Imagine que você precisa exibir um texto "A PARTIR" de uma determinada expressão encontrada. Com um pouco de imaginação poderíamos para o, a partir do comando sed, que ele precisa apagar as linhas "1" até a expressão encontrada. Na prática, isso atenderia nosso objetivo.
sed '1,/STRING A SER ENCONTRADA NO ARQUIVO/d' #Lembrando que 1, indica que estamos partindo da linha de número um e o "/d" indica que queremos deletar as linhas.
more #Comando para ler um arquivo paginado. Limitado, você só pode descer a paginação
less #Outro comando para leitura de um arquivo paginado, porém com vários modos de navegação, pesquisa e comandos
find #Busca avançada de arquivos
find / -name FILE* #Busca pelos arquivos que iniciem pelo nome FILE de maneira recursiva a partir do diretório raiz "/"
find /home/ -type f -exec du -sh {} \; #O parâmetro type especifica o tipo de arquivo que o find vai procurar e o parâmetro exec informa ao script que um comando deverá ser executado para cada arquivo encontrado. A sintaxe padrão deve ser observada e respeitada "{} \"
find /tmp/ -date #Especifica a data em que o arquivo foi modificado para que retorne na busca
seq #Comando que realiza uma sequência numérica. Muito utilizado em loopings
seq 5 2 20 #Sequência de 5 a 20 com intervale a cada 2
expr #Expressões matemáticas, contas
expr 5 + 3 #Lembrar de sempre expressar os valores separados por espaços
#Por padrão o comando não trabalhará com casas decimais, apenas inteiros
#Para multiplicar deve-se proteger o carácter asterisco: "\*"
bc #Outro comando utilizado para fazer expressões matemáticas no shell
#ex: echo "4*(2+3)" | bc #Resultado 20
tar #Empacota e pode compactar um grupo de arquivos e diretórios 
# -c #Cria um arquivo ".tar"
# -v #Verbose, mostra os detalhes do processo
# -f #Necessário para definir o nome do arquivo ".tar" ou ".tar.gz" gerado
# -z #Habilita compressão em gzip
# -t #Usado para listar o conteúdo de um arquivo tar
# -x #Extrai um grupo de arquivos e diretórios (pode ser usado com tar ou tar.gz)
## Para extrair um arquivo específico basta colocar o nome do arquivo após o nome do pacote tar ou tar.gz
## --wildcards '*.jpg' #para extração apenas de arquivos jpg
# -C #Caso deseje apontar um local diferente para extração

Redirecionamento de entrada e saída

Em Scripts Shell ou até mesmo no dia a dia é comum o administrador de sistemas executar vários comandos de maneira conjunta ou sequencial.

Abaixo estarei demonstrando como realizar o sequenciamento de comandos e como o shell interpreta as saídas e erros dos comandos.

Para entrada de comandos na interface chamamos de STDIN. Basicamente é tudo que o shell receberá de informação do administrador de sistemas.

Por outro lado, para saída de comandos padrões, sem falhas, damos o nome de STDOUT. Nesse cenário o Shell guardará na variável $0 o valor 0 (zero).

Agora, para saída de comandos com falhas, damos o nome de STDERR. Nesse cenário o Shell guardará na variável $0 o valor diferente de 0 (zero).

Redirecionamento de STDOUT ou STDERR para um arquivo de texto (log)

> #Cria um novo Arquivo
>> #Adiciona linhas para um novo arquivo ou existente
> log.out 2> log-erro.out #Logs de sucesso e erro em saídas distintas
> log.out 2>&1 #Log único para sucesso e erro
/dev/null #Buraco negro, muito usado quando queremos direcionar uma saída para "lugar nenhum" apenas tirar da tela

ex:
ls -lha >/tmp/log-success.log 2>/tmp/log-error.log
ls -lha >/tmp/log-success.log 2>&1
ls -lha 2>/dev/null

Também podemos fazer o redirecionamento de entrada

Ex:
tr < arquivo

Execução sequencial de Comandos no Linux

comando1; comando2; comando3 #O ponto e vírgula permite o sequenciamento de três comandos em uma única linha. Os comandos não são dependentes entre si e serão executados em sequência independente do resultado de cada um
comando1 && comando2 #Desse modo o segundo comando apenas será executado se o primeiro comandos não retornar problemas (STDERR=0)
comando1 || comando2 #Desse modo o segundo comando apenas será executado se o primeiro apresentar problemas (STDERR!=0)
(comando em subshell) #Ao incluirmos um comando entre parênteses, estamos informando ao shell que um sub shell seja aberto. As variáveis de ambiente não exportadas não serão reconhecidas

Por fim, não deixe de acompanhar a sequência dessa Jornada. Pois, na parte 2 dessa jornada falaremos sobre REGEX, File Globbing e Variáveis de Ambiente no Linux.

3 thoughts on “Shell Script: Comandos Essenciais no Linux

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.