Linux shell script instrução case


A instrução case


A instrução case é uma boa alternativa para a instrução

if-then-else-fi (multinível)

O case permite que você combine vários valores com uma variável.
É mais fácil ler e escrever.


Para saber usar o case é necessário conhecer e saber usar o comando test.
Conhecer e saber usar if then else e fi.
Saber declarar variáveis junto com o if then else e fi somado ao comando test.


Exemplo:

## Declarando variável
VAR5=$1

## if, comando test (outra declaração) e then
if test "$1" -gt 1; then
	echo "$1 é maior que 1"
## else
else
	echo "$1 não é 1"
## fi
fi

O mesmo que o de cima :

VAR5=$1

if [ "$1" -gt 1 ]; then
	echo "$1 é maior que 1"
else
	echo "$1 não é 1"
fi

A instrução case permite que:

você verifique facilmente o padrão (condições).
Em seguida, processe uma linha de comando.
Se essa condição for avaliada como verdadeira.


Em outras palavras, o nome da variável $ é comparado com os padrões
até que uma correspondência seja encontrada.


*) atua como padrão e é executado se nenhuma correspondência for encontrada. O padrão pode incluir curingas.


Você deve incluir dois ponto e vírgula

;;

no final de cada comandoN.


O shell executa todas as instruções até os dois pontos-e-vírgulas que
estão próximos um do outro.


O esac é sempre necessário para indicar a declaração de final de caso.


Exemplo :

#!/bin/bash

#====================
## Data: 18-08-2020
## Nome: case_comando_argumentos.sh
## Exemplo de uso:
## ./case_comando_argumentos.sh -e nome_do_arquivo.txt
#====================

# Declarando variáveis
OPT=$1   	# opção
FILE=$2  	# nome do arquivo

# -------------------

echo
echo "Listando os 10 primeiros arquivos."
echo
sleep 3

	ls -t | head
	echo
read -p "Tecle Enter para continuar."

## 		test -e e -E correspondência de
## 		args de linha de comando

case $OPT in
  -e|-E)
  	echo "Editando arquivo $2 ..." 	## certifique-se de que o nome do arquivo
  									## foi passado corretamente, caso contrário,
  									## será exibido um erro

  	[ -z $FILE ] && { echo "Falta o nome do arquivo"; exit 1; } || nano $FILE
  	;;

  -c|-C)
  	echo "Exibindo arquivo $2 ..."

  	[ -z $FILE ] && { echo "Falta o nome do arquivo"; exit 1; } || cat $FILE
  	;;

  -d|-D)
  	echo "Hoje é $(date)"
  	;;

   *)
    echo "Argumento ruim!"
    echo "Uso: $0 -ecd nome-do-arquivo"
    echo "	-e file : Edita o arquivo."
    echo "	-c file : Exibe o arquivo."
    echo "	-d      : Mostra data e hora atual."
    ;;

esac

Conclusão :

A instrução case pode ser entendida por seres humanos comuns. O exemplo final é sofisticado mas, o trabalho que realiza é muito simples.

O usuário após criar o Bash shell script, dá permissão de execução. Abre o terminal onde o script está. Digita o nome do script com uma de 3 opções -e, -c e -d. A opção -e vai abrir um arquivo no nano para o usuário poder editar. A opção -c permite que o usuário leia o arquivo. A opção -d informa a data e hora atual do do sistema. Você poderia fazer a mesma coisa de maneiras muito mais simples, até mesmo com um Bash shell script bem tosco com poucas linhas, mas, aí você não aprenderia a usar o case, variáveis, if, then, else, fi. E estes, ao contrário do script tosco que eu gosto, podem ser utilizados para realizar grandes trabalhos que valem ouro.


Até Breve!

🙂


Um bash shell script para o Nautilus

#!/usr/bin/env bash

######################

# titulo: 1Bb-CV-mp4-2-mkv.sh
# data: 07-05-2020
# bash shell script para o nautilus
# -------------------
# autor: semanickz
# -------------------
# site: https://semanickz.worpress.com
# -------------------
# -------------------
# obs: este script é para o gerenciador de arquivos,
# no meu entender, ele é direcionado a "UM E APENAS UM ARQUIVO EM
# QUESTÃO" neste caso o "$1".
# ele executa o serviço direto no arquivo.
# não aparece terminal nenhum. Você pode escrever
# vários tipos de scripts para um arquivo.
# por exemplo toda vez que encontrar um certo
# tipo de arquivo clica nele e o envia para determinado
# diretório, ou faz o que quiser com ele
# -------------------
# -------------------

######################

# 1 - sobrescreve metadata
exiftool -all= -overwrite_original -ext "$1" .

# 2 - converte para mkv
for f in "$1"; do
ffmpeg -i "$f" -map_metadata -1 -c:v copy -c:a copy -map 0 "${f%.*}.mkv"
done

# 3 - remove mp4
sleep 3

for f in "$1"; do
rm -f "$f"
done

# ---- até aqui para cima, tudo bem.

## 4 ajusta título e sobrescreve metadata # não funcionou para mim
#for f in "$1"; do
#mkvpropedit "$f" -e info -s title="${f::-4}"
#mkvpropedit "$f" --tags all:
#mkvpropedit "$f" -d title
#done

# --- pesquisar pela web...

# ----- alias do meu .bashrc # funcionou no lugar do item ## 4
source MKV3b-remov-metadata-mkv.sh

# fim do script

Senha de Linux ou UNIX protege arquivos?

A senha de Linux ou UNIX protege arquivos?

# ----------------

Como protejo arquivos com senha?

# ----------------

O GNU/Linux e outros sistemas Unix oferecem fortes permissões de arquivo e o conceito de ACL (lista de controle de acesso) na segurança do computador Linux/UNIX, usada para forçar a separação de privilégios. No entanto, nenhum deles oferece uma senha para proteger arquivos.

Você pode usar a ferramenta de criptografia e assinatura GNU gpg (GNU Privacy Guard).

É um conjunto de software criptográfico.

# ----------------

Muitos novos usuários de UNIX/Linux ficam confusos com esse fato.

A solução é usar os seguintes comandos para criptografar ou descriptografar arquivos com uma senha.

Use o comando GNU gpg.

Use o comando mcrypt.

Use o comando openssl.

# ----------------

MCRYPT COMANDO

Mcrypt é um programa simples de criptografia, um substituto para a antiga criptografia unix. Ao criptografar ou descriptografar um arquivo, um novo arquivo é criado com a extensão .nc e modo 0600. Istale pelo software center do seu sistema GNU/Linux.

O novo arquivo mantém a data de modificação do original. O arquivo original pode ser excluído especificando o parâmetro -u.

---

EXEMPLOS:

Encriptar data.txt file:

$ mcrypt data.txt

Output:

Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
A new file is created with the extension .nc i.e. data.txt.nc:

$ ls data.txt.nc
$ cat data.txt.nc

Descritografar data.txt.nc file:
$ mcrypt -d data.txt.nc

Output:

Enter passphrase:
File data.txt.nc was decrypted.
Verify that file was decrypted:

$ ls data.txt
$ cat data.txt

# ----------------

COMANDO OPENSSL

O OpenSSL é um kit de ferramentas de criptografia que implementa os protocolos de rede Secure Sockets Layer (SSL v2 / v3) e Transport Layer Security (TLS v1) e os padrões de criptografia relacionados exigidos por eles.

Você pode usar o programa openssl, que é uma ferramenta de linha de comando para usar as várias funções de criptografia da biblioteca de criptografia do OpenSSL a partir do shell.

Pode ser usado para criptografar e descriptografar arquivos com uma senha.

# ----------------

Por exemplo vou criptografar file.txt para file.out usando AES de 256 bits no modo CBC

$ openssl enc-aes-256-cbc -salt -in file.txt -out file.out.

# ----------------

Descriptografe o arquivo criptografado file.out

$ openssl enc-d -es-256-cbc -in file.out

Onde, enc: codificação com cifras.

# ----------------

Uma opção bem fácil também, é usar o SEAHORSE-NAUTILUS. Instale pelo software center do seu sistema GNU/Linux.

# ----------------

Teste com arquivos copiados, até pegar prática.

# ----------------

Você pode até criar um bash shel script para facilitar mais ainda...

#!/usr/bin/env bash

########################

# autor: Arceu Valenti_1000%
# test_cryptografar_mcrypt.sh
# data: 29042020
# versão: 0.0
# uso: ./test_cryptografar_mcrypt.sh

#######################

clear

echo -e "\nAbra o terminal onde está o arquivo a ser criptografado e tecle\
Enter.\nPara sair tecle Ctrl+c"

sleep 2

echo ""

# ------------------------ #

echo -e "\nListando os primeiros arquivos...\n"

sleep 2

ls -tCF | head -15

echo ""

# ------------------------ #

read -p "Digite o nome completo do arquivo : " FILE # armazena URL

echo -e "Você digitou: $FILE" # imprime a FILE

# ------------------------ #

echo "" # parágrafo

# ------------------------ #

echo -e "\e[1mPara criptografar digite um (1), descriptografar dois (2)\e[0m"

while : # loop while
do # fechamento de do é done
read DIGITE # armazena digito 1 ou 2
case $DIGITE in # caso o digito seja...
# fechamento de case é esac

# ------------------------ #

1) # dígito 1 executa...
echo -e "Você digitou: $DIGITE, critografando... "

mcrypt "$FILE" # comando 1

break # sai após executar comando
;;

# ------------------------ #

2) # dígito 2 executa...
echo -e "Você digitou $DIGITE, descriptografando... "

mcrypt -d "$FILE" # comando 2

break # sai após executar comando
;;

# ------------------------- #

*)
echo -e "Desculpe eu só entendo 1 e 2." # se não for nem 1 nem 2...

;;
esac # fechamento de case e sai

# ------------------------ #

done # fechamento de do e acabou

# ------------------------ #

echo ""

read -p "Para deletar o arquivo original Tecle Enter.\
Para sair tecle Ctrl+c."

rm -f "$FILE"

# ------------------------ #

echo -e "\n:Confere a lista de arquivos:\n"

sleep 2

ls -tCF | head -15

# ------------------------ #

echo -e "\n\e[1;33;40m*** E tá tudo resolvido! ***\e[0m\n" # mensagem final

# ------------------------ #

# fim do script

---

Até Breve!

---

Bash abrir um terminal por um arquivo shell script?

---

Linux como abrir um terminal em um shell script e executar um comando

---

Como criar um script que abra as janelas do terminal e execute comandos nelas?

# ---------------------------------

No gnome-terminal, vá para Editar -> Preferências do perfil -> Título. Clique na guia comando. Selecione Segure o terminal no menu suspenso chamado Quando o comando sair. Você deve criar um novo perfil para isso e executar com ele.

gnome-terminal --window-with-profile=NAMEOFTHEPROFILE -e command

# ---------------------------------

Exemplo:

gnome-terminal --window-with-profile=DUPLOTERM -e command

# ---------------------------------

Comandos para colocar no shell script:

gnome-terminal -- commando

Exemplo:

gnome-terminal -- epiphany -p "https://start.duckduckgo.com/ & exit

# ---------------------------------

Ou:

xterm -e command

Ou:

konsole -e command

Também:

terminal -e command

# ---------------------------------

Para fazer o terminal ficar quando o comando acabar:

No Konsole tem a opção --noclose flag.

No Xterm tem a opção -hold flag.

# ---------------------------------

Um Bash shell script para testar isto?

# ---------------------------------

#!/usr/bin/env bash

#########################

# test_abrir_terminal_executar_cmd.sh

#########################

clear

# ----------------------- #

function abreterm(){

echo "URL exemplo: https://start.duckduckgo.com/"

sleep 2

read -p "Digite a URL que deseja abrir : " URL

echo "Executando... Para fechar o terminal tecle ctrl+c."

sleep 2

gnome-terminal -- epiphany -p "$URL" &

}

abreterm

# fim do script

# ---------------------------------

OBS:
Tavez fosse mais legal fazer assim:

# ---------------------------------

#!/usr/bin/env bash

#########################

# test_abrir_programa_e_sair.sh

#########################

clear

# ----------------------- #

function abreprog(){

echo "URL exemplo: https://start.duckduckgo.com/"

sleep 2

read -p "Digite a URL que deseja abrir : " URL

echo "Executando..."

sleep 2

firejail epiphany -p "$URL" & exit

}

abreprog

exit 0

# fim do script

# ---------------------------------

Até Breve!

:)

# ---------------------------------

Bash scripts para bot Telegram

Linux bash scripts para usar em bots no Telegram.

---

#!/usr/bin/env bash

########################

# test_telegr_bot_send_stickers.sh
# precisa do: 1) token, 2) chat_id, 3) código do sticker
# (acha com getupdates info de um sticker enviado a alguém)

########################

# ---- Variáveis ---- #

# TOKEN1=""

# URL_UP='https://api.telegram.org/bot"$TOKEN1"/getupdates'

# ------------------- #

read -p "*** Vamos ver os updates do bot. Tecle Enter ***"

read -p "Digite o TOKEN do bot : " TOKEN1

# ------------------- #

echo "Verificando..."

sleep 2

# curl "$URL_UP"

curl https://api.telegram.org/bot"TOKEN1"/getupdates

echo ""

# ------------------- #

echo "*** Enviar sticker ***"

sleep 2

echo ""

read -p "Digite o token : " TOKEN

read -p "Digite o chat_id : "

read -p "Digite o numero do sticker : "

# ------------------- #

# EXEMPLO:
# <a href="https://api.telegram.org/bot/sendSticker?chat_id=&sticker=BCBBADAgADOQADfyekzlsDlKEqOOd72VLKAg">https://api.telegram.org/bot/sendSticker?chat_id=&sticker=BCBBADAgADOQADfyekzlsDlKEqOOd72VLKAg

curl https://api.telegram.org/bot"TOKEN"/sendSticker?chat_id="CHAT_ID"&sticker="TICKER"

# ------------------- #

echo "Confere..."
sleep 2

echo ""

curl https://api.telegram.org/bot"TOKEN1"/getupdates

echo ""

# fim do script

---

#!/usr/bin/env bash

#################

# test_bot_enviar_arquivo.sh

# telegram bot enviar arquivo. tem que ter token e chat_id

#################

clear

read -p "Digite o Token : " TOKEN

read -p "Digite o chat_id : " CHAT_ID

read -p "Digite o nome/caminho do arquivo : " FILE

curl -v -F "chat_id=$CHAT_ID" -F document=@"$FILE" https://api.telegram.org/bot"TOKEN"/sendDocument

echo ""

# fim do script

---

#!/usr/bin/env bash

#################

# tgr_msg.sh

# telegram bot envia mensagem

#################

URL="https://api.telegram.org/bot$TOKEN/sendMessage"

clear

read -p "Digite o Token : " TOKEN

read -p "Digite o chat_id : " CHAT_ID ; read -p "Digite a mensagem : " MSG

curl -s -X POST "$URL" -d chat_id="$CHAT_ID" -d text="$MSG"

echo ""

# fim do script

---

#!/usr/bin/env bash

#################

# trg_search_id.sh

# busque atualizações de bot e procure o id do bate-papo

#################

read -p "Digite o Token : " TOKEN

curl https://api.telegram.org/bot"TOKEN"/getUpdates

echo ""

# fim do script

---

Até breve!

Criar Telegram bot rodando no Linux?

Telegram como criar um bot? Um bot bem básico no Linux só para iniciar?

Aqui o que consegui entender...

---

1) Precisa do: BotFather

2) Pode usar uma plataforma para programar o bot por exemplo:

Menu Builder Bot ou chatfuelbot

---

OBS:

Telegram comandos botfather - Comandos do botfather:

Eu posso ajudá-lo a criar e gerenciar bots do Telegram. Se você é novo na API Bot, consulte o manual (https://core.telegram.org/bots). Você pode me controlar enviando estes comandos:

/newbot - create a new bot
/mybots - edit your bots [beta]

Edit Bots
/setname - change a bot's name
/setdescription - change bot description
/setabouttext - change bot about info
/setuserpic - change bot profile photo
/setcommands - change the list of commands
/deletebot - delete a bot

Bot Settings
/token - generate authorization token
/revoke - revoke bot access token
/setinline - toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups - can your bot be added to groups?
/setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames - edit your games (https://core.telegram.org/bots/games) [beta]
/newgame - create a new game (https://core.telegram.org/bots/games)
/listgames - get a list of your games
/editgame - edit a game
/deletegame - delete an existing game

---

Comandos que usei no botfather do Telegram:

1) /start
2) /newbot

meumeubot

username: meumeu

---

Feito! Parabéns pelo seu novo bot. Você o encontrará em:

t.me/meumeubot

---

Com isso feito, você recebeu a chave de API do seu bot. A chave da API é como o Telegram sabe que o código que você escreve está associado a esse bot em particular. Todo bot tem sua própria chave de API e você não deve compartilhá-lo com ninguém, ou alguém pode invadir seu bot e fazer com que ele pratique más ações. Isso encerra nossa conversa com o BotFather por enquanto no código!

---

O TOKEN - Use this token to access the HTTP API:

numeros-e-letras-do-meu-token

---

Agora você pode adicionar uma descrição, sobre seção e foto de perfil para o seu bot, consulte /help para obter uma lista de comandos. A propósito, quando você terminar de criar seu bot legal, execute um ping no nosso Suporte de Bot se quiser um nome de usuário melhor para ele. Apenas verifique se o bot está totalmente operacional antes de fazer isso.

---

Meumeu

username: meumeubot

t.me/meumeubot

---

Mantenha seu token seguro e armazene-o com segurança, ele pode ser usado por qualquer pessoa para controlar seu bot. Para uma descrição da API Bot, consulte esta página:

https://core.telegram.org/bots/api

---

O bot pode funcionar no Linux.

Configurando as gemas e o diretório do bot.

Abra o terminal e faça mkdir telegram-bot.

Isso cria um novo diretório para os arquivos do seu bot.

É melhor mantê-los confinados em uma pasta para facilitar o gerenciamento. Navegue para o diretório com cd telegram-bot e faça o seguinte:

mkdir ~/Documentos/telegram-bot

cd ~/Documentos/telegram-bot

touch Gemfile

touch bot.rb

atom Gemfile

atom bot.rb

---

Oneliner?

mkdir ~/Documentos/telegram-bot; cd ~/Documentos/telegram-bot ; touch Gemfile; touch bot.rb; atom Gemfile ; atom bot.rb

---

OBS:

Isso cria dois arquivos em branco, um para especificar as gemas necessárias e outro para o código do bot. O último comando abre esses dois arquivos.

---

CONTINUANDO...

---

No arquivo Gemfile cole o seguinte:

source 'https://rubygems.org'
gem 'telegram_bot'

---

Isso diz ao Bundler para pegar a interface do Ruby para a API do Telegram no rubygems.org. Para concluir a configuração da gema, volte ao seu terminal e digite bundle. É isso para a configuração das gemas, agora estamos finalmente entrando no código.

---

Codificando seu primeiro bot de Telegram

---

O código real que será executado constantemente no servidor está dentro do bot.rb. ele está vazio no momento, mas aqui vamos vincular a gema do Telegram que acabamos de agrupar e criar um bot. Não há muito código para escrever.

---

Ele examina o que cada parte do código faz e o escreve à medida que avançamos.

require 'telegram_bot'
token = 'TOKEN'
bot = TelegramBot.new(token: token)

(Substitua o TOKEN pelo token da API que você copiou do BotFather)

---

O Ruby facilita bastante adivinhar o que o código fará. As três linhas acima adicionam a funcionalidade bot do Telegram ao seu arquivo e, em seguida, criam um novo objeto bot da classe TelegramBot, autenticado com seu token para que o programa saiba para onde enviar os dados.

A próxima parte é um grande loop. Parece confuso no começo, mas é fácil de separar.

---

bot.get_updates(fail_silently: true) do |message|
puts "@#{message.from.username}: #{message.text}"
command = message.get_command_for(bot)

message.reply do |reply|
case command
when /start/i
reply.text = "Tudo que posso fazer é dizer Olá. Tente o comando /greet."
when /greet/i
reply.text = "Olá, #{message.from.first_name}. 🤖"
else
reply.text = "IEu não tenho idéia do que #{command.inspect} significa."
end
puts "enviando #{reply.text.inspect} to @#{message.from.username}"
reply.send_with(bot)
end
end

---

A primeira linha diz ao bot para continuar ouvindo comandos. E, quando recebe um comando para passá-lo para a variável de mensagem.
A linha de put registra o comando no seu terminal para que você possa ver o que está acontecendo enquanto o bot é executado.
As ações de resposta do bot são armazenadas em uma declaração de caso.
A entrada da instrução de caso é alimentada a partir da variável de mensagem depois de limpa pelo método get_command_for da gema.
O texto de resposta do bot é definido dependendo do comando armazenado e, finalmente, enviado com send_with antes de o loop reiniciar. Com essa configuração, agora você pode encontrar seu bot no Telegram, enviar os comandos /start e /greet e assisti-lo em ação.

---

Para fazer isso, salve as alterações no Atom e execute:

ruby bot.rb

No terminal. Enquanto esse terminal estiver aberto e funcionando, seu bot enviará respostas!

---

Personalizando seu novo e brilhante bot - O bot que você acabou de criar é bom, mas não é muito interessante.

Os bits básicos estão lá, o que significa que você pode trocá-los e ampliá-los facilmente.

As partes a serem observadas ao personalizar são as linhas when/ command/ i e o texto entre as aspas nas linhas reply.txt.

Essas são as entradas que seu bot aceita e as mensagens que ele envia de volta como respostas. Portanto, se você quiser dizer algo diferente como resposta ao comando /greet, altere o valor de reply.text abaixo da linha de comando greet (quando /greet /i).

---

Aqui está uma variação que você pode tentar:

when /greet/i
greetings = ['bonjour', 'hola', 'hallo', 'sveiki', 'namaste', 'salaam', 'szia', 'halo', 'bom dia']
reply.text = "#{greetings.sample.capitalize}, #{message.from.first_name}!"

---

Aqui, criei uma matriz com algumas maneiras diferentes de dizer olá e, em seguida, adicionei uma à mensagem aleatoriamente usando o método de amostra

---

Transformando seu bot em algo incrível - você pode adicionar quantos comandos, respostas e recursos quiser ao bot.

A maior parte é imaginação e muito pesquisa em ferramentas de busca na web à medida que avança.

Se você quiser aprender muitas coisas aplicáveis a esse bot, comece com Learn Ruby the Hard Way para entender o básico do idioma.

Com um pouco de prática e uma dependência saudável do StackOverflow, você poderá:

Conectar outras APIs para extrair dados de fontes como Airtable, Slack, RSS ou Twitter.

É aí que entra a funcionalidade realmente interessante - você pode criar um bot que atua como uma interface de conversação para um conjunto de dados ou recursos, como um bot que retorna resultados de pesquisa do Twitter ou postagens no Slack.

---

ARMAZENE A ENTRADA DO USUÁRIO EM UM BANCO DE DADOS.

Você pode criar um bot do Telegram que ofereça suporte automatizado aos usuários ou responda a perguntas e armazene seus endereços de e-mail em um banco de dados. A gema Sequel facilita a criação, gravação, edição e leitura de bancos de dados.

Construa uma aventura de texto. Colossal Cave Adventure, um dos primeiros jogos de terminal, foi transportado para o Telegram como um bot.

Se você precisar de inspiração, poderá ler o código-fonte bot de outras pessoas e verificar uma lista de bots do Telegram. Tente descobrir como eles funcionam e recriá-los como prática.

---

Executando seu bot 24/7 - No momento, seu bot está sendo executado no seu terminal no seu computador.

Tudo bem até que você precise reiniciar o computador, o wi-fi cai ou o computador entra no modo de suspensão. Quando isso acontece, ele encerra o processo do bot e os usuários não recebem uma resposta dele. O processo de mover seu bot de um ambiente de desenvolvimento (seu computador em que você usou o Atom para gravá-lo) para um ambiente de produção (um servidor) é conhecido como implantação.

---

Existem algumas opções para implantar seu bot, mas nos dois casos começaremos fazendo o upload dos arquivos no Bitbucket.

O Bitbucket permite que você use o git, um sistema de controle de versão que ajuda você a fazer e acompanhar com segurança as alterações no código do seu bot.

Ao fazer o upload dos arquivos do seu bot para o Bitbucket, você pode usar o Bitbucket como uma maneira de capturar os arquivos do bot quando estiver conectado ao host. Inscreva-se no Bitbucket e crie um novo repositório.

---

Com o terminal aberto e no mesmo diretório que o código-fonte do seu bot, digite o seguinte:

git init
git add .
git commit -m 'initial commit'

---

Agora, siga as instruções mostradas pelo Bitbucket depois de criar o novo repositório. Os meus são: Depois de inserir esses dois comandos destacados no meu terminal e fornecer a minha senha do Bitbucket quando solicitado, os arquivos são enviados. Com seu código vivendo na nuvem, é hora de escolher uma maneira de implantar.

---

Implantando com um Raspberry Pi - Este pequeno computador Raspberry Pi na minha mesa hospeda vários bots - Um Raspberry Pi é um ótimo investimento se você planeja criar e implantar bots - você pode obter um a partir de US $ 7 mais o preço de um cartão SD. Ele usa muito pouca energia, para que você possa mantê-la ligada o tempo todo e não se preocupar com o custo. Pode ser tentador comprar um pacote que vem com teclado, mouse e estojo, mas tudo o que você precisa é de um carregador USB, cartão SD, cabo Ethernet e o próprio computador. Você provavelmente já tem a maioria dessas coisas em seu escritório. Implantando com um servidor em nuvem - Você não precisa possuir o computador em que seu bot está executando, pode usar a memória e a energia da máquina de outra pessoa para executá-lo remotamente. As soluções populares para implantação na nuvem incluem Amazon Web Services (AWS), DigitalOcean e Heroku.

---

Dos três, os mais novos acho que são são DigitalOcean e Heroku. Ao se inscrever no DigitalOcean e criar uma nova conta, você aprenderá como se conectar ao servidor via SSH e iniciar o console. A partir daqui, é o mesmo processo que você fez na sua máquina local, independentemente do servidor que você está usando.

No final, parece ser, vamos para a implantação real.

---

O processo de implantação - em um servidor novo - seja um Raspberry Pi ou um servidor em nuvem como o Digital Ocean - você precisará instalar Ruby, Bundler e Git:

sudo apt-get update
sudo apt-get upgrade
curl -L https://get.rvm.io | bash -s stable --ruby
sudo apt-get install bundler
sudo apt-get install git

---

Em seguida, crie um novo diretório para o seu bot, navegue até lá e faça o download dos arquivos do Bitbucket com os seguintes comandos:

mkdir bots
cd bots
git clone https://[email protected]/meu_repo_bitbucket/telegram-bot.git

---

Lembre-se de substituir o URL acima (https://meu_repo_bitbucket…) pelo URL do repositório do seu bot no Bitbucket.

Você encontrará todo o comando clone por meio do Bitbucket, portanto não precisará fazer isso manualmente. Em seguida, digite bundle para instalar as dependências da gem e, em seguida, ruby bot.rb para iniciar a execução permanente do bot.

---

Nota:

Se você estiver acessando seu servidor via SSH, precisará executar o bot com:

nohup ruby bot.rb

Para garantir que o bot não pare de funcionar quando a sessão SSH for encerrada. Agora você está livre para fechar a janela do terminal, seguro de que seu bot está emitindo um bipe silencioso em segundo plano. Isso conclui sua primeira facada em um bot do Telegram. Ao longo do caminho, você aprendeu sobre o terminal, Ruby, gems, a API do Telegram e como implantar um bot em um servidor.

---

Comandos Linux e shell script revisão

Comandos Linux Revisao

---
O que é um sistema operacional? Sempre que você liga o computador, você vê uma tela na qual pode realizar atividades diferentes, como escrever, navegar na Internet ou assistir a um vídeo ele está lá.

O que faz o hardware do computador funcionar assim?

Como o processador do seu computador sabe que você está solicitando a execução de um arquivo mp3?

Bem, é o SISTEMA OPERACIONAL ou o KERNEL que faz esse trabalho. Um kernel é um programa no cerne, na base ou no coração de qualquer sistema operacional que cuida de coisas fundamentais, como permitir que o hardware se comunique com o software. Portanto, para trabalhar no seu computador, você precisa de um sistema operacional (SO). Na verdade, você está usando um enquanto lê isso no seu computador. Agora, você pode ter usado sistemas operacionais populares como Windows, Apple OS X, mas aqui aprenderemos o que é o Linux e quais benefícios ele oferece sobre outras opções de sistemas operacionais. Os benefícios do uso do Linux? O Linux agora desfruta de popularidade em seu auge, e é famoso entre programadores e usuários regulares de computadores em todo o mundo. Seus principais benefícios são:

Oferece um sistema operacional gratuito. Você não precisa desembolsar centenas de dólares para obter o sistema operacional como o Windows!

Sendo de código aberto, qualquer pessoa com conhecimento de programação pode modificá-lo. Os sistemas operacionais Linux agora oferecem milhões de programas/aplicativos para escolher, a maioria deles grátis! Depois de instalar o Linux, você não precisa mais de um antivírus! O Linux é um sistema altamente seguro. Mais ainda, há uma comunidade global de desenvolvimento constantemente procurando maneiras de melhorar sua segurança. A cada atualização, o sistema operacional se torna mais seguro e robusto. O Linux é o sistema operacional preferido para ambientes de servidor devido à sua estabilidade e confiabilidade (megaempresas como Amazon, Facebook e Google usam Linux para seus servidores). Um servidor baseado em Linux pode funcionar sem parar sem reinicializar por anos a fio.

---
A principal vantagem do Linux era que os programadores podiam usar o Linux Kernel para projetar seus próprios sistemas operacionais personalizados. Com o tempo, uma nova gama de sistemas operacionais amigáveis inundou o mundo dos computadores. Agora, o Linux é um dos mais populares e amplamente utilizados Kernel, e é a espinha dorsal de sistemas operacionais populares como Debian, Knoppix, Ubuntu, Solus, Deepin, Mx-Linux e Fedora. No entanto, a lista não termina aqui, pois EXISTEM MILHARES DE SISTEMAS OPERACIONAIS BASEADOS EM LINUX que oferecem uma variedade de funções aos usuários. O Linux Kernel é normalmente usado na combinação do projeto GNU do Dr. Richard Stallman.

TODAS AS DISTRIBUIÇÕES MORDERNAS DO LINUX SÃO NA VERDADE DISTRIBUIÇÕES DO LINUX/GNU.

---
Por que aprender interface de linha de comando? Embora o mundo esteja migrando para sistemas baseados em GUI, a CLI tem seus usos específicos e é amplamente usada em scripts e administração de servidores. Vejamos alguns usos convincentes. Comparativamente, os comandos oferecem mais opções e são flexíveis. Tubulação e stdin/stdout são imensamente poderosos não estão disponíveis na GUI. Algumas configurações na GUI têm até 5 telas de profundidade, enquanto em uma CLI é apenas um único comando. Mover, renomear milhares de arquivos na GUI consumirá muito tempo (usar Control/Shift para selecionar vários arquivos), enquanto estiver na CLI, usar expressões regulares para executar a mesma tarefa com um único comando. A CLI carrega rapidamente e não consome.

---
O grande atrativo do terminal é que, com exceção de alguns poucos aplicativos específicos, os comandos são sempre os mesmos. Isso faz com que ele seja um porto seguro, com o qual você pode contar, sem importar se você está no Ubuntu ou no Slackware. O terminal é também a forma mais natural de "conversar" com o sistema, sempre que você precisa de qualquer coisa fora do comum.

Comandos básicos do Linux/Unix - o gerenciamento de arquivos se torna fácil se você souber os comandos certos. Às vezes, os comandos também são chamados de "programas", pois sempre que você executa um comando, é o código do programa correspondente, escrito para o comando, que está sendo executado. Por exemplo, imagine que você precisa mover todos os arquivos com extensão .jpg de uma pasta com muitos arquivos para outra. Em vez de precisar mover um por um, ou fazer algum malabarismo com a ordem de exibição dos arquivos (para organizar a exibição com base na extensão dos arquivos e poder assim selecionar todos os .jpg com o mouse), você poderia simplesmente abrir o terminal e digitar:

mv *.jpg /outra-pasta

Além dos comandos básicos, dois outros recursos que tornam o terminal tão poderoso são a possibilidade de combinar diferentes comandos para executar tarefas mais complexas (ou filtrar os resultados para localizar informações específicas) e a possibilidade de escrever pequenos programas em shell script.

---
Comandos mais usados para um usuário linux tem a ver com arquivos e sua manipulação. Tudo começa com coisas simples muito importantes. Quais são elas? Se mover pelos diretórios, mover arquivos de um diretório para outro, copiar, recortar, colar, renomear, baixar, converter e sobrescrever. Para isto em grande escala ou em um único arquivo, o terminal do Linux é bastante útil.

1- pwd Diz onde está na árvore de diretórios.
2- cd Permite se mover pelos diretórios, cd .., cd -, cd ~/caminho/para/diretório. cd /usr/local/bin, cd 'dir com espaço'.
3- ls Lista o que existe no diretório, ls -t, ls -lah, ls -R
4- mv Move de um diretório a outro ou renomeia arquivos. Opções: -i, -u, -v
5- cp Copia arquivo, cp -r Copia diretório, cp arquivo_antigo novo_nome_arquivo Renomeia um arquivo substituindo nome antigo por um novo nome. Opções: -i, -n, -u, -R, -v
6- rm -f Remove arquivos, rm -r Remove diretório.
7- rmdir Remove diretório vazio. Opções: -p, -pv (Remove todos os pais e subdiretórios junto com o detalhado).
8- mkdir -p Cria diretórios e subdiretórios. mkdir –p nome_dir/{sub1,sub2,sub3}
9- date Data atual
10- cat Imprime conteúdo de arquivo na tela. cat ~/Documentos/texto_teste.txt. Opções: -b, -n, -s, -E
11- df -h Mostra tamanho, espaço usado e espaço disponível
12- exit Sai do teminal
13- find Encontra arquivos que existem mas não lembra onde os colocou. find . -name *nomedoarquivo* , find . -type f -name *nomedoarquivo*
12- finger
13- free -h
14- grep Este comando é usado para procurar uma sequência/palavra específica em um arquivo de texto. É semelhante a "Ctrl + F", mas executado via CLI. Opções: -i, -n, -v, -c
15- egrep (grep -E)
16- head
17- tail
20- history
21- kill
22- less
23- man
24- clear Limpa a tela do terminal
25- sort Este comando classifica os resultados de uma pesquisa alfabética ou numericamente. Arquivos, conteúdo e diretórios podem ser classificados usando este comando. Opções: -r, -f, -n.
26- tar Compacta arquivos em formato .tar. Exemplo: tar -cvf nome_do_arquivo_tar diretório_a_ser_compactado
27- touch Cria arquivo, modifica horário de acesso a arquivo. Comando: touch texto_teste.txt Cria arquivo chamado: texto_teste.txt

---
Existem muitos outros comandos, saber sobre eles depende quais o usuário necessita usar diariamente.

---
Comandos mais usados em Shell Script no Linux? São muitos e podem ser combinados de diversas maneiras. Um usuário que escreve scripts em sua casa necessita saber quais comandos para evoluir em seus estudos rotineiros?
Qual é o seu usuário? Se você não tem certeza qual é o seu usuário, use o comando "whoami" sem aspas, para saber. Como o prompt de usuário normal pode ser diferente para cada um, podemos em algum momento usar "prompt$" para indicar o prompt da linha de comando.

---
ESCOLHER O DIRETÓRIO ONDE COLOCAR O SCRIPT - Para que o script possa ser executado de qualquer parte do sistema, mova-o para um diretório que esteja no seu PATH. Para ver quais são estes diretórios, abra agora o terminal pelo menu do sistema e digite o comando:
echo $PATH

---
Se não tiver permissão de mover para um diretório do PATH, deixe-o dentro de seu diretório pessoal ($HOME). Digite no terminal: $HOME

---
CRIAR O ARQUIVO E COLOCAR NELE OS COMANDOS. Abra pelo menu do sistema o editor de texto gedit, pluma, leafpad, mousepad ou outro editor de textos de sua preferência para colocar todos os comandos dentro do arquivo.

---
Os shell scripts mais comuns são invólucros simples em torno dos binários de terceiros ou do sistema. Um wrapper (invólucro, embrulho) nada mais é do que um script de shell, uma função de shell ou um alias que inclui um comando ou utilitário do sistema.

---
COLOQUE A CHAMADA DO SHELL NA PRIMEIRA LINHA. A primeira linha do script deve ser:

#!/usr/bin/env bash

Para que ao ser executado, o sistema saiba que é o bash quem irá interpretar estes comandos.

---
TORNE O SCRIPT UM ARQUIVO EXECUTÁVEL

Use o seguinte comando para que seu script seja reconhecido pelo sistema como um comando executável (chmod +x):

chmod +x nome-do-teu-shellscript.sh

---
Para permitir que todos os usuários possam executar o script:

chmod +x nome-do-teu-shellscript.sh

---
EXECUTE O SCRIPT

./nome-do-teu-shellscript.sh (Aqui "./" representa o diretório atual)

/home/seu-usuário/bin/nome-do-teu-shellscript.sh (Aqui informa onde está o script para que o bash execute em outra pasta)

---
BASH EXECUTANDO COMANDOS

Shell script é uma linguagem de script usada em vários sistemas operacionais, com diferentes dialetos, dependendo do interpretador de comandos utilizado.
Um exemplo de interpretador de comandos é o bash, usado na grande maioria das distribuições GNU/Linux. A maior parte dos usuários classificam shell script como uma linguagem de fácil aprendizagem. O primeiro passo é, saber o que se deseja fazer, então ver qual o código que executa este comando em shell e aí criar, basta escrever o código em algum editor de texto e salvar. Veja só por exemplo, que de tempos em tempos você quer saber informações do sistema, instalar programas, remover programas, converter/alterar arquivos, fazer backups, adicionar informações, remover informações, etc.

---
AGORA ABRE O TERMINAL E DIGITA COMANDOS, POR EXEMPLO, DIGITE ESTES COMANDOS ABAIXO UM DE CADA VEZ (cada linha é um comando):

echo
ls
echo 'ls é Listar arquivos'
echo ''
echo ""
echo "Olá!"
printf 'Bem vindo ao bash!' (Aperte a tecla enter e digite: ls)
echo '#!/bin/bash'
echo "#!/usr/bin/env bash"
echo ; echo "Olá!" ; echo
echo -e 'Bom\nDia\nMundo!'
echo "Hello world!"
echo "Hello "world"!"
echo "Hello \"world\"!"
printf "Hello world" (Aperte a tecla enter e digite: cd ~)
pwd
ls -t
sleep 7
echo ; echo 'Olá!' ; sleep 3 ; ls -t
free -h -t
free -th
sleep 4
date
cal
du -h
uptime
df -h
clear
free -tmlh
df -a -h
df -k -l
df -T -m
echo ; whoami ; echo
ls ; echo ; pwd ; echo
echo ; ls -at ; echo
du *
ls -lah
du -hcs
du -sch
du -ach
du -Sh
du -Sk
clear
echo ; echo 'df: Relata o espaço de disco usado pelo sistema (Usado e Livre)' ; echo
ls -hat
echo ; echo "du: Relata o espaço utilizado no disco de tal arquivo ou diretório" ; echo
whereis bash
VALOR="Linux"
echo $VALOR
echo $VALOR $VALOR
VALOR='ls -t'
$VALOR
touch Meu_Arquivo.txt
ls -t
ls -t | head
pwd
rm -f Meu_Arquivo.txt
ls -t
echo 'Cadê Meu_Arquivo.txt?'
echo $VALOR
VALOR='free -h -t'
$VALOR
echo $VALOR
echo VALOR
read VALOR (aperte a tecla enter, digite: "ls" sem aspas e aperte enter.)
$VALOR
read VALOR (aperte a tecla enter, digite: "uptime" sem aspas e aperte enter.)
$VALOR
echo ; $VALOR ; echo ; $VALOR ; echo
echo ; $VALOR ; sleep 4 ; echo ; $VALOR ; echo
unset VALOR
echo ; $VALOR
$VALOR
clear
echo -e '\nOlá!\nVamos\nSaber\nOs\nComandos\ndo\nShellscript Linux!'
clear ; echo -e '\n \nOlá!\n \nVamos\n \nSaber\n \nOs\n \nComandos\n \ndo\n \nShellscript Linux!\n'
HOJE=$(lsblk)
echo "Informação sobre dispositivos de bloco: $HOJE"
unset HOJE
echo $HOJE
echo $((2*3))
echo $((2*4-2/2+3))
VALOR=44
echo $((VALOR*1))
echo $((VALOR*2))
echo $((VALOR*3))
VALOR=$((VALOR+1))
echo $VALOR
VALOR=$((VALOR+11))
echo $VALOR
VALOR=$((VALOR+1))
echo $VALOR
VALOR=$((VALOR+11))
echo $VALOR
unset VALOR
echo $VALOR
VALOR=$(uname -a)
echo $VALOR
HOJE=$(arch)
echo $HOJE
echo "Informação sobre o kernel: $VALOR" ; echo ; echo "Informação sobre a arquitetura do sistema: $HOJE"
echo 'Informação sobre o kernel: $VALOR' ; echo ; echo 'Informação sobre a arquitetura do sistema: $HOJE'
unset VALOR
unset HOJE
echo "Informação sobre o kernel: $VALOR" ; echo ; echo "Informação sobre a arquitetura do sistema: $HOJE"
echo 'Informação sobre o kernel: $VALOR' ; echo ; echo 'Informação sobre a arquitetura do sistema: $HOJE'
printf "%-5s %-10s %-4s\n" No Nome Pontos
printf "%-5s %-10s %-4.2f\n" 1 Marta 8
printf "%-5s %-10s %-4.2f\n" 2 Joel 9
printf "%-5s %-10s %-4.2f\n" 3 Carlos 7
clear
exit

---
O comandos mais longos pode copiar e colar no terminal se quiser, mas no início seria melhor digitar. Saiba que a partir deste momento você já está entendendo coisas extremamente úteis para escrever shellscript usando o Bash! Uma coisa interessante sobre os comandos acima, é que para estudar eles, você não precisa estar conectado a internet. Os comandos acima oferecem informações interessantes e úteis. Podemos colocar todos eles em um só script e executar. Dependendo do caso, é mais fácil que digitar um a um de cada vez toda vez que precisar. SE PUDER, ANTES DE CONTINUAR EXECUTE OS COMANDOS ACIMA QUE TE CHAMARAM MAIS A ATENÇÃO DE NOVO POIS, EXECUTAR ELES É MUITO DIDÁTICO. NADA MELHOR QUE APRENDER PRATICANDO.

---
ASPAS SIMPLES ' E ASPAS DUPLAS " (as duas são úteis em determinadas circunstâncias). ASPAS DUPLAS permitem interpretar caracteres especiais. ASPAS SIMPLES desabilitam esta interpretação.

---
CARACTERES DE ESCAPE:
echo "Hello \"world\"!"

---
TODO SCRIPT ESCRITO PARA RODAR NO BASH COMEÇA COM:

#!/bin/bash OU #!/usr/bin/env bash

Após "#!/bin/bash" de um espaço entre linhas e então pode começar a digitar comandos.

---
Exemplo:

#!usr/bin/env bash

# Este é um comentário!
# Em bash shell scripts não recomendam usar
# ponto e vírgula para separar comandos.
# Mas acontece dos primeiros scripts serem assim.
# Sem variáveis, sem declarações ou comparações; apenas comandos.

clear

echo ; date ; echo ; sleep 4

echo ; cal ; echo ; sleep 4

echo ; uptime ; echo ; sleep 4

echo ; df -h ; echo ; sleep 4

echo ; free -html ; echo ; sleep 4

echo ; whoami ; echo ; sleep 4

echo ; pwd ; echo ; sleep 4

echo ; ls -at ; echo ; sleep 4

echo ; whereis bash ; echo ; sleep 4

echo ; echo 'Este é o fim do script 01-script.sh' ; echo ; sleep 4

exit

# fim do script
---

ESTE SCRIPT INOFENSIVO ACIMA SERÁ SALVO NA PASTA HOME, A PASTA DA CASINHA, USANDO UM EDITOR DE TEXTO COM O NOME DE:

01-script.sh
---

Posso melhorar/tornar mais amigável este script acima explicando sobre cada comando:

#!/bin/bash

clear

echo ; echo 'Hoje é data:' ; echo ; sleep 2

echo ; date ; echo ; sleep 4

echo ; echo 'Hoje pelo calendário é:' ; echo ; sleep 2

echo ; cal ; echo ; sleep 4

echo ; echo 'Esta máquina está funcionando a:' ; echo ; sleep 2

echo ; uptime ; echo ; sleep 4

echo ; echo 'Sobre o tamanho desta pasta:' ; echo ; sleep 2

echo ; df -h ; echo ; sleep 6

echo ; echo 'Sobre a memória RAM:' ; echo ; sleep 2

echo ; free -html ; echo ; sleep 6

echo ; echo 'Você está logado como:' ; echo ; sleep 2

echo ; whoami ; echo ; sleep 4

echo ; echo 'Você está em:' ; echo ; sleep 2

echo ; pwd ; echo ; sleep 4

echo ; echo 'Neste diretório/pasta tem:' ; echo ; sleep 2

echo ; ls -at ; echo ; sleep 6

echo ; echo 'O Bash está em:' ; echo ; sleep 2

echo ; whereis bash ; echo ; sleep 4

echo ; echo 'Este é o fim do script 01-script.sh' ; echo ; sleep 4

exit

# fim do script
---

No Linux o script deve ter permissão de execução, isto pode ser feito abrindo o terminal pelo menu do sistema e executando o comando:

chmod +x 01-script.sh
---

Depois de salvo você tem que executar o arquivo, dessa forma:

./01-script.sh
---

Viu alguma utilidade neste pequeno script?

Então siga adiante.
---

IMPORTANTE:

Para estudar shell script tem que ser como usuário normal. Se você está acessando o sistema como usuário administrador (root), saia e entre como um usuário normal. É muito perigoso estudar shell usando o superusuário, você pode danificar o sistema com um comando errado. Ok, continuemos.

---

Para exibir um manual do bash ou mesmo do comando 'chmod', digite na linha de comando:

man bash

man chmod
---

É possível executar o arquivo mesmo sem modificar a permissão de execução, por exemplo, se for um arquivo escrito para ser executado pelo bash, usar:

1) bash meu_script.sh
2) sh 'nome_do_arquivo_sem_aspas'
3) ./'nome_do_arquivo_sem_aspas'
---

SHELL - É importante saber o que é Shell? O shell do Linux é o Bash. A shebang do shell script é #!/usr/bin/env bash. Os comandos do Linux são executados no Bash. Na linha de comandos de um shell, podemos utilizar diversos comandos um após o outro, ou mesmo combiná-los numa mesma linha embora isto não seja o mais recomendado. Se colocarmos diversas linhas de comandos em um arquivo texto simples, teremos em mãos um Shell Script, ou um script em shell, já que Script é uma descrição geral de qualquer programa escrito em linguagem interpretada, ou seja, não compilada. Outros exemplos de linguagens para scripts são o PHP, Perl, Python, JavaScript e muitos outros. Podemos então ter um script em php, um script perl e assim em diante. Uma vez criado, um ShellScript pode ser reutilizado quantas vezes for necessário. Seu uso, portanto, é indicado na automação de tarefas que serão realizadas mais de uma vez. Todo sistema Unix/Linux e similares são repletos de scripts em shell para a realização das mais diversas atividades administrativas e de manutenção do sistema. Os arquivos de lote (batch - arquivos *.bat) do Windows são também exemplos de ShellScripts, já que são escritos em linguagem interpretada e executados por um Shell do Windows, em geral o command.com ou hoje em dia o cmd.exe. Os Shells do Unix, porém, são inumeras vezes mais poderosos que o interpretador de comandos do Windows, podendo executar tarefas muito mais complexas e elaboradas.

---
OS SCRIPTS SHELL PODEM SER AGENDADOS PARA EXECUÇÃO ATRAVÉS DA TABELA CRONTAB, ENTRE OUTRAS COISAS.

É uma ferramenta indispensável aos administradores de sistemas Unix.

O Shell mais comum e provavelmente o que possui mais scripts escritos para ele é também um dos mais antigos e simples, o sh.

Este shell está presente em todo o sistema tipo Unix, incluído o Linux, FreeBSD, AIX, HP-UX, OpenBSD, Solaris, NetBSD, Irix, etc. Por ser o shell nativo mais comum é natural que se prefira escrever scripts para ele, tornando o script mais facilmente portável para outro sistema.

Os Shells não estão diretamente associados a um ou outro tipo de Unix, embora várias empresas comerciais tenham suas próprias versões de Shell. No software livre o Shell utilizado em um sistema em geral é exatamente o mesmo utilizado em outro. Por exemplo, o bash encontrado no Linux é o mesmo shell bash encontrado no FreeBSD e pode também facilmente ser instalado no Solaris, Windows através do Cygwin [1] ou outros sistemas Unix comerciais para passar a ser utilizado como interface direta de comandos ou como interpretador de scripts. O mesmo acontece com o tcsh e vários outros shells desenvolvidos no modelo de software livre.

---
INTERAGIR COM O USUÁRIO

Para o script ficar mais completo, vamos colocar uma interação mínima com o usuário, pedindo uma confirmação antes de executar os comandos.

---
#!/usr/bin/env bash

#################

# isto é um comentário
# comentários são ignorados pelo script
# servem para ajudar e informar o programador

#################

# limpa a tela
clear

# imprime pergunta na tela
echo "Vou buscar os dados do sistema. Posso continuar? [S/n] "

# armazena resposta
read RESPOSTA

# testa a resposta e executa
test "$RESPOSTA" = "n" && exit

# imprime informação na tela
echo ; echo "Data e Horário:" ; echo

# comando mostra data
date

# espaço entre linhas
echo

# imprime informação na tela
echo "Uso do disco:"

# espaço entre linhas
echo

# comando informa uso de espaço em disco
df -ht

# espaço entre linhas
echo

# imprime informação na tela
echo "Usuários conectados:"

# espaço entre linhas
echo

# comando w
w

# espaço entre linhas
echo

# imprime informação na tela
echo "Seu nome de login é:"

# comando whoami
whoami

# espaço entre linhas
echo

# comando para sair
exit

# fim do script

---
O comando "read" leu o que o usuário digitou e guardou na variável RESPOSTA. Logo em seguida, o comando "test" verificou se o conteúdo dessa variável era "n". Se afirmativo, o comando "exit" foi chamado e o script foi finalizado. Nessa linha há vários detalhes importantes:

1) O conteúdo da variável é acessado colocando-se um cifrão "$" na frente
2) O comando test é útil para fazer vários tipos de verificações em textos e arquivos
3) O operador lógico "&&", só executa o segundo comando caso o primeiro tenha sido OK. O operador inverso é o "||"

---
MELHORAR O CÓDIGO DO SCRIPT - Com o tempo, o script vai crescer, mais comandos vão ser adicionados e quanto maior, mais difícil encontrar o ponto certo onde fazer a alteração ou corrigir algum erro. Para poupar horas de estresse, e facilitar as manutenções futuras, é preciso deixar o código visualmente mais agradável e espaçado, e colocar comentários esclarecedores.

---
#!/bin/bash

# nome-do-script - script que mostra informações sobre o sistema
# Autor: Fulano da Silva
# Pede uma confirmação do usuário antes de executar

clear

echo "Vou buscar os dados do sistema. Posso continuar? [S/n]"

read RESPOSTA

# Se ele digitou 'n', vamos interromper o script

test "$RESPOSTA" = "n" && exit

# O date mostra a data e a hora correntes

sleep 3 ; echo "Data e Horário:" ; echo

date

sleep 3

echo

# O df mostra as partições e quanto cada uma ocupa no disco
echo "Uso do disco:"

sleep 3

echo

df

echo

sleep 6

# O w mostra os usuários que estão conectados nesta máquina

echo "Usuários conectados:"

sleep 3

echo

w

sleep 3

echo

# fim do script

---
Basta iniciar a linha com um "#" e escrever o texto do comentário em seguida. Estas linhas são ignoradas pelo shell durante a execução. O cabeçalho com informações sobre o script e seu autor também é importante para ter-se uma visão geral do que o script faz, sem precisar decifrar seu código. Também é possível colocar comentários no meio da linha # como este

---

Para fazer uma pergunta direta (que é o formato mais simples), usamos o comando "read ", que lê uma resposta e a armazena em uma variável. Quase sempre ele é usado em conjunto com o "echo", que permite escrever texto na tela, fazendo a pergunta, como em:

#!/usr/bin/env bash

echo "Digite a URL do arquivo a baixar"
read arquivo
wget -c $arquivo

# fim do script

---
Com estes três comandos, criamos um gerenciador de downloads primitivo, que pede a URL do arquivo (que você poderia colar no terminal usando o botão central do mouse) e faz o download usando o wget, que é um gerenciador em modo texto, muito usado em scripts. A URL digitada é armazenada na variável "arquivo", que pode ser usada ao longo do script. Ao usá-la, é necessário incluir um "$", que faz com que o shell entenda que se trata da variável "arquivo" e não de um trecho de texto qualquer. Quando o script fosse executado, o "wget -c $arquivo" seria transformado em algo como: "wget -c http://gdhpress.com.br/arquivo.zip", iniciando o download. O "-c" é uma opção para o wget, que faz com que ele continue o download caso interrompido. Se você pressionasse "Ctrl+C" durante o download para encerrar o script e o executasse novamente, fornecendo a mesma URL, ele continuaria o download de onde parou.

---
USAR O COMANDO/PROGRAMA DIALOG NOS BASH SHELL SCRIPTS:

O dialog é muito fácil de usar. Se você tem o teclado à mão, aqui está um exemplo de uma linha de uma caixa de mensagem que você pode tentar.
Cole este exemplo no terminal:

dialog --title 'Message' --msgbox 'Olá, Mundo!' 5 20

Depois tecle Enter, digite: clear e tecle Enter. Este exemplo cria uma caixa de mensagem com o título "Mensagem", contendo a saudação "Olá, mundo!". A caixa tem 5 linhas de altura e 20 caracteres de largura, com a mensagem bem centralizada na caixa. Um botão "OK" aparece na parte inferior; pressionar dispensa o menu. Tipos de caixas de diálogo - a maioria das chamadas para caixas de diálogo tem um formato semelhante: um título opcional, o tipo de caixa de diálogo, o texto a ser exibido e a altura e largura (em caracteres) da caixa de diálogo. Seguem parâmetros adicionais específicos para cada tipo de menu. Vamos dar uma breve olhada em cada um dos tipos disponíveis. O menu "yesno" é muito semelhante ao nosso primeiro exemplo:

dialog --title "Message" --yesno "Você está se\ divertindo?" 6 25

Escolha sim ou não. Depois tecle Enter, digite: clear e tecle Enter. Se você tentar este exemplo, verá que agora existem dois botões na parte inferior, rotulados como "Sim" e "Não". Você pode selecionar entre os botões usando as teclas do cursor (ou ) e fazer sua seleção pressionando . O status de saída retornado ao shell será 0 se "Sim" for escolhido e 1 se uma seleção "Não" for feita. Você pode tentar experimentar os parâmetros de altura e largura. Se a largura for menor que o comprimento da string, ela será quebrada (nos limites da palavra). Se você tornar a caixa de diálogo muito pequena, os caracteres serão perdidos. Anteriormente, vimos a caixa de mensagem. A "caixa de informações" é semelhante, exceto pelo fato de não esperar o usuário selecionar um botão "OK". Isso é útil para exibir uma mensagem enquanto uma operação está em andamento. Aqui está um exemplo:

dialog --infobox "Favor esperar" 10 30 ; sleep 4

A "caixa de entrada" permite que um usuário insira uma string. As teclas de edição habituais podem ser usadas e o campo de texto rola, se necessário. Depois que o usuário digita os dados, eles são gravados no erro padrão (ou mais comumente redirecionados para um arquivo como neste exemplo):

dialog --inputbox "Digite seu nick:" 8 40 2>answer

dialog --inputbox "Digite seu nome:" 10 40 2>nome.txt (Joga a resposta para um arquivo chamado nome.txt)

---
Dialog exemplo de mensagem:

dialog --title Information[!] --msgbox "Esta é uma menssagem informativa." 10 50

---
Dialog tem certeza que...

dialog --title "Confirmation" --yesno "Deletar mesmo este arquivo?" 10 40

---
Pega um nome de arquivo como parâmetro:

dialog --textbox /etc/profile 22 70

---
Imagine que você está fazendo um script conversor de vídeos, que é capaz de gerar arquivos em quatro diferentes formatos. O script começa perguntando qual formato usar e, de acordo com a resposta, executa os comandos apropriados para fazer a conversão. Para simplificar, vamos fazer com que o script simplesmente converta todos os arquivos dentro do diretório atual, em vez de perguntar quais arquivos converter ou de exibir uma caixa de seleção. A parte da pergunta poderia ser feita com o "echo", como no exemplo anterior. Como agora são várias linhas de texto, usei aspas simples ( ' ) em vez de aspas duplas. As aspas simples permitem que você inclua quebras de linha e caracteres especiais dentro do texto, fazendo com que o shell simplesmente escreva tudo literalmente:

#!/usr/bin/env bash

echo ' Escolha o formato de saída:
1) MPEG4, 320x240 (vídeos no formato 4:3)
2) MPEG4, 320x176 (vídeos em formato wide)
3) Real Player, 320x240 (vídeos no formato 4:3)
4) Real Player, 320x176 (vídeos em formato wide)
(Responda 1, 2, 3 ou 4, ou qualquer outra tecla para sair)'

read resposta

---
No final deste trecho, teríamos a variável "resposta", que armazenaria um número de 1 a 4. Precisamos agora fazer com que o script decida o que fazer de acordo com a resposta.

O jeito mais simples de fazer isso seria simplesmente colocar um bloco com 4 comandos "if " (se), um para cada possibilidade. Cada "if" é sempre acompanhado por um "then " (então) e um "fi " (fim do se), como em:

if [ "$resposta" = "1" ]; then
[comandos ...]
fi

if [ "$resposta" = "2" ]; then
[comandos ...]
fi

if [ "$resposta" = "3" ]; then
[comandos ...]
fi

if [ "$resposta" = "4" ]; then
[comandos ...]
fi

---
Uma forma mais elegante (e mais à prova de falhas), seria usar o "elif " (que poderia ser traduzido para "senão se") e o "else " (senão), como em:

if [ "$resposta" = "1" ]; then
[comandos ...]

elif [ "$resposta" = "2" ]; then
[comandos ...]

elif [ "$resposta" = "3" ]; then
[comandos ...]

elif [ "$resposta" = "4" ]; then
[comandos ...]
else

echo "Você digitou uma opção inválida. O script termina aqui."
fi # Fechamento do if

---
Como pode ver, ao usar o elif você não precisa mais incluir um "fi" para cada possibilidade. Outra vantagem é que você pode agora incluir um "else" no final, que faz com que o script responda com uma mensagem de erro ao receber alguma resposta que não estava esperando. Dentro de cada uma das condições, você incluiria um bloco de comandos destinado a gerar os arquivos convertidos com os parâmetros correspondentes, como em:

if [ "$resposta" = "1" ]; then
for i in *; do
mencoder -oac mp3lame -lameopts cbr:br=128 -ovc lavc -lavcopts \
vcodec=mpeg4:vbitrate=512 -ofps 16 -vf scale=320:176 -o "c-$i"
"$i"
done
elif [ "$resposta" = "2" ]; then
[o resto do script...]

---
Esse comando gigante que se esparrama pela terceira e a quarta linha é um comando de conversão do mencoder (um pequeno utilitário de conversão de arquivos de mídia em modo texto, que é bastante flexível), que gera um arquivo de vídeo otimizado para ser assistido em smartphones. Esse é o tipo de comando que é longo demais para ser escrito manualmente, mas que pode perfeitamente ser usado através de um script. Veja que a variável "i" é usada no final da quarta linha, para indicar o nome do arquivo. O "c-$i" "$i" faz com que o script adicione o prefixo "c-" no nome dos arquivos convertidos, permitindo que eles sejam incluídos na pasta sem apagar os arquivos originais. O comando do mencoder é colocado dentro de outra condicional, agora usando o "for " (enquanto), que permite que o script execute um conjunto de comandos repetidamente. No exemplo, ele é usado para fazer com que o comando de conversão do mencoder seja executado uma vez para cada arquivo dentro da pasta. Ao ser executado, a variável "i" (poderia ser qualquer outro nome) recebe o nome do primeiro arquivo, o que faz com que ele seja convertido. Ao chegar no "done", o interpretador volta à linha inicial e a variável "i" recebe agora o nome do segundo arquivo. O processo é então repetido para cada um dos arquivos da pasta, até o último (a lista dos arquivos a converter é gerada pelo interpretador no início do script, por isso não existe o risco do conversor ficar em loop). O "for i in *; do" poderia ser traduzido como "para cada arquivo dentro da pasta atual, execute".

---
CARACTERÍSTICAS - OS SCRIPTS SHELL PODEM CONTER ESTRUTURAS DE PROGRAMAÇÃO TAIS COMO:

ESTRUTURAS DE DECISÃO (if)
Recurso utilizado para dar sequencia em fluxos de execução baseado decisões. Cuja sintaxe é:
- Condição Verificada é o teste que definirá se controle deve ser passado para dentro do bloco then, observe que esse teste é feito sobre a saída de um comando.
- Ação são comandos a serem executados em caso verdadeiro da condição verificada.

---
OPERADORES PARA NÚMEROS

-eq Verifica se é igual,
-ne Verifica se é diferente,
-lt Verifica se é menor,
-gt Verifica se é maior,
-le Verifica se é menor ou igual,
-ge Verifica se é maior ou igual.

---
OPERADORES PARA TEXTO

!= Verifica se é diferente,
= Verifica se é igual.

---
OPERADORES LÓGICOS

! Lógica NOT,
-o Lógica OU, (OR) ou ||,
-a Lógica E, (AND) ou &&.

---
OPERADOR PARA arquivos/

-d Verifica se é diretório,
-f Verifica se é arquivo,
-e Verifica se existe.

---
Exemplo:

# !/bin/baxh
# Uso de Estrutura de Decisão
clear

echo 'opções'
echo '======'
echo ' -> Data do Sistema'
echo ' -> Uso do Sistema'

read opcao

if [ "$opcao" -eq 1 ]
then
echo 'Data do sistema: ' && date

elif [ "$opcao" -eq 2 ]
then

echo 'Uso do disco: ' && df -Th
fi

# fim do script

---
ESTRUTURAS DE REPETIÇÃO (FOR)(WHILE) - ESTRUTURA DE REPETIÇÃO FOR: Permite que ações de iteração sejam executadas sobre determinados comandos ou variáveis até que a condição seja satisfeita.

# !/bin/bash

clear

echo "DIAS DA SEMANA"
for dia in seg ter qua qui sex sab dom
do
echo "$dia"
done

# fim do script

---
ESTRUTURA DE REPETIÇÃO WHILE - Em situações onde sabemos até onde o loop irá realizar uma contagem o ideal é usar o for entretanto em cenarios onde a iteração deve cessar somente após se satisfazer uma condição o uso do laço while é mais indicado. Exemplo:

# /bin/bash

clear
var=1
while [ $var -le 7 ]
do
echo "Valor de var: $var"
var=$((var+1))
done

# fim do script

---
FUNÇÕES E ARGUMENTOS

---
Uma prática um pouco mais avançada é o uso de funções. Elas permitem que você crie blocos de código destinados a executarem tarefas específicas que podem ser usados ao longo do script. Em outras palavras, as funções são pequenos scripts dentro do script. A grande vantagem de criar funções (em vez de simplesmente repetir os comandos quando precisar) é que, ao atualizar o script, você precisa alterar apenas um bloco de comandos, em vez de precisar procurar e alterar os comandos manuais em vários pontos do script. Por permitirem reaproveitar o código, as funções fazem com que o script seja mais organizado e fique com menos linhas, o que facilita muito a manutenção em scripts complexos.

---
msgerro()
{
echo "Algo deu errado durante a conexão. O erro foi:"

echo "$msg"
}

---
Veja que a função começa com uma declaração ("msgerro()"), onde você especifica um nome e adiciona o "()", que faz com que o sistema entenda que se trata de uma função e não de um outro bloco de comandos qualquer. Os comandos são, em seguida, colocados dentro de um par de chaves ( { .... } ), que indicam o início e o final. A partir daí, você pode executar os comandos dentro do script chamando o nome da função (msgerro), como se fosse um comando qualquer.

---
Ex:

#!/usr/bin/env bash

###############

# REALIZAR BACKUP DO DIR

###############

echo -e " \033[1;33m Digite o caminho de origem.: \033[0m "
read DIR_ORIGEM

clear

# -------------------------- # Este é um comentário que serve pra organizar

echo -e " \033[1;34m Digite o caminho de destino.: \033[0m "
read DIR_DESTINO

clear

verifica_argumentos(){ # O nome da função é: verifica_argumentos

if [ $# -lt 1 ];
then

echo "Faltou informar um dos argumentos (parametros) necessarios!"

exit 1

fi

}

# -------------------------- #

copia_arquivos(){ # O nome da função é: copia_arquivos

verifica_argumentos

clear

echo "Realizando backup..."

# Verificando se o dir de destino existe

if ! [ -d $DIR_DESTINO ]
then

mkdir $DIR_DESTINO

echo "Diretorio de Destino Criado"

fi

# -------------------------- #

# COPIANDO ARQUIVOS

for arq in `ls $DIR_ORIGEM`
do

cp /$DIR_ORIGEM/$arq $DIR_DESTINO/$arq.bak

done

}

copia_arquivos # Chama a função pelo nome dela

# fim do script

---
DEFINIÇÕES DE VARIÁVEIS E ESCOPO DESTAS

Variáveis são definidas pela nomenclatura NOME_VARIAVEL="Valor da Variável". O valor pode ser tanto numérico quanto texto.

Nome="Joel"

Se quisermos acessá-la, basta fazer referência a ela com o caractere $ (cifrão) antes do nome: o comando echo $Nome, por exemplo, retornará a palavra "Joel".

Se quiser sabe informações sobre os sistemas de arquivo nos quais cada ARQUIVO reside ou, por padrão, sobre todos os sistemas de arquivos posso abrir um terminal e digitar:

VarInfo="df -h"

Depois digito no terminal "$VarInfo" sem aspas.

---
VARIÁVEIS DE AMBIENTE

As variáveis de ambiente independem da definição do usuario. Elas são criadas automaticamente, no momento em que se faz o login no sistema.

Ex:

PATH: define diretórios de procura por programas executados no shell;
USER: informa o nome do usuário do shell;
HOME: informa o caminho do diretório home do usuário;
PWD: diretório atual;

---
As variáveis são a base de qualquer script. É dentro delas que os dados obtidos durante a execução do script serão armazenados. Para definir uma variável, basta usar o sinal de igual "=" e para ver seu valor, usa-se o "echo":

---
Execute estes comandos abaixo no terminal:

---
VARIAVEL="um dois tres"

echo $VARIAVEL

echo $VARIAVEL $VARIAVEL

---
Para remover a variável acima:

unset VARIAVEL

---
Teste:

echo $VARIAVEL

---
É possível armazenar a saída de um comando dentro de uma variável. Ao invés de aspas, o comando deve ser colocado entre "$(...)", execute no terminal os comandos abaixo:

HOJE=$(date)

echo "Hoje é: $HOJE"

unset HOJE

echo $HOJE

HOJE=$(ls)

echo "O conteúdo desta pasta tem: $HOJE"

unset HOJE

echo $HOJE

HOJE=$(free -hmt)

echo "Informando sobre a memória desta máquina: $HOJE"

unset HOJE

echo $HOJE

---
EXEMPLOS DE USO DO SHELL SCRIPT:

Apagar arquivos velhos - Apagar periodicamente arquivos mais velhos que 30 dias do diretório /tmp:

#!/bin/bash

cd /tmp
find . -type f -mtime +30 -delete

# fim do script

---
Este seria o conteúdo de um shell script que sempre que fosse executado apagaria arquivos com data de modificação maior que 30 dias a partir do diretório /tmp do sistema de arquivos. Notem que ele é nada mais do que uma associação de 2 comandos (cd e find) em um arquivo para facilitar a repetição da tarefa. Este poderia ser, por exemplo, o conteúdo do arquivo /bin/limpatmp.sh e poderíamos chamar este script pela linha de comandos sempre que desejássemos repetir esta ação:

limpatmp.sh

Onde o símbolo "$" representa o prompt de comandos. Do ponto de vista do usuário este seria mais um comando disponível para uso. Os scripts em shell são também muito empregados junto à inicialização do sistema (para auto-iniciar tarefas) ou como mini-aplicativos, que facilitam tarefas dos usuários, tais como montagem de dispositivos, menus de ajuda, etc. Sua primeira linha obrigatoriamente começa com um "#!" (que não se deve confundir com um comentário qualquer, pois realmente é uma exceção; este par se chama, em inglês, de shebang), informando diretamente ao núcleo (kernel) qual interpretador ele deverá usar, juntamente com seu caminho, de acordo com a necessidade de cada caso. Exemplo:

#!/bin/bash

Em seguida, são adicionados os comandos desejados, um por linha, ou separados por ponto e vírgula. Exemplo:

mount -t reiserfs /dev/hda1 /mnt/hda1

ls /mnt/hda1

cp -r /mnt/hda1/* /home/user/backup
umount /dev/hda1

---
Por fim, dá-se a permissão de execução a este arquivo de texto simples ("chmod +x arquivo").

---
DATA ANTERIOR

#!/bin/bash

# Função em Bash para retornar a data anterior, levando em conta o mês e ano.

fn_data_anterior()
{
DIA=$D
MES=$M
ANO=$A

# Dado DIA, MES e ANO numéricos, obtém a data do dia anterior

DIA=`expr $DIA - 1`
if [ $DIA -eq 0 ]; then
MES=`expr $MES - 1`
if [ $MES -eq 0 ]; then
MES=12
ANO=`expr $ANO - 1`
fi
DIA=`cal $MES $ANO`
DIA=`echo $DIA | awk '{ print $NF }'`
fi
}

ano=`date +%Y`;
mes=`date +%m`;
let dia=10\#`date +%d`;

if (( $dia<10 ));
then
j=0$dia;
else
j=$dia;
fi
dia=$j;
j="";

D=$dia
M=$mes
A=$ano

fn_data_anterior

echo $DIA $MES

# fim do script

---
DETALHES SOBRE OS COMANDOS - Diferente de outras linguagens de programação, o shell não usa os parênteses para separar o comando de seus argumentos, usa sim o espaço em branco. O formato de um comando é sempre:

COMANDO + OPÇÕES + PARÂMETROS

O "read" é um comando do próprio shell, já o "date"" é um executável do sistema. Dentro de um script, não faz diferença usar um ou outro, pois o shell sabe como executar ambos. Assim, toda a gama de comandos disponíveis no GNU/Linux pode ser usada em scripts. Há vários comandos que foram feitos para serem usados com o shell, eles são ferramentas.

---
VEJAMOS ALGUNS DELES:

O comando "cat" mostra o conteúdo de um arquivo. O comando "cat -n sistema" mostra o
nosso script, com as linhas numeradas.

O "-n" é a opção para o comando, que o instrui a
numerar linhas, e "sistema" é o último argumento, o nome do arquivo.

cat (imprime texto)

cat -n, cat -s (comando com opções)

---
cut (Extrai campo)

cut -d -f (comando com opções)

cut -c (comando com opções)

---
date Mostra data as opções são: -d, +'...'

---
find Encontra arquivos, as opções são: -name, -iname, -type f, -exec

---
grep Encontra texto, as opções são: -i, -v, -r, -qs, -w -x

---
head Mostra Início, as opções são: -n, -c

---
printf Mostra texto as opções são: nenhuma

---
rev Inverte texto, as opções são: nenhuma

---
sed Edita texto, as opções são: -n, s/isso/aquilo/, d

---
seq Conta Números, as opções são: -s, -f

---
sort Ordena texto, as opções são: -n, -f, -r, -k -t, -o

---
tail Mostra Final, as opções são: -n, -c, -f

---
tr Transforma texto, as opções são: -d, -s, A-Z a-z

---
uniq Remove duplicatas, opções: -i, -d, -u

---
wc Conta Letras, opções: -c, -w, -l, -L

---
Use "man nome-do-comando" ou "nome-do-comando --help" para obter mais informações sobre cada um deles.

---
O melhor, é que em shell é possível combinar comandos, aplicando-os em seqüência, para formar um comando completo. Usando o pipe "|" é possível canalizar a saída de um comando diretamente para a entrada de outro, fazendo uma cadeia de comandos.

---
Exemplo:

prompt$ cat /etc/passwd | grep root | cut -c1-10
root:x:0:0
prompt$

---
O cat mostra o arquivo todo, o grep pega essa saída e extrai apenas as linhas que contêm a palavra "root" e o cut por sua vez, somente nessas linhas que o grep achou, extrai os 10 primeiros caracteres. Isso funciona como uma estação de tratamento de água, onde ela entra suja, vai passando por vários filtros que vão tirando as impurezas e sai limpa no final. E por fim, também é possível redirecionar a saída de um comando para um arquivo ao invés da tela, usando o operador ">". Para guardar a saída do comando anterior no arquivo "saida", basta fazer:

cat /etc/passwd | grep root | cut -c1-10 > saida

cat saida

---
O COMANDO TEST - O canivete suíço dos comandos do shell é o "test", que consegue fazer vários tipos de testes em números, textos e arquivos. Ele possui várias opções para indicar que tipo de teste será feito, algumas delas:

-lt Núm. é menor que (LessThan)
-d É um diretório
-gt Núm. é maior que (GreaterThan)
-f É um arquivo normal
-le Núm. é menor igual (LessEqual)
-r O arquivo tem permissão de leitura
-ge Núm. é maior igual (GreaterEqual)
-s O tamanho do arquivo é maior que zero
-eq Núm. é igual (EQual)
-w O arquivo tem permissão de escrita
-ne Núm. é diferente (NotEqual)
-nt O arquivo é mais recente (NewerThan)
= String é igual
-ot O arquivo é mais antigo (OlderThan)
!= String é diferente
-ef O arquivo é o mesmo (EqualFile)
-n String é não nula
-a E lógico (AND)
-z String é nula
-o OU lógico (OR)

---
SCRIPT QUE TESTA ARQUIVOS - Tente fazer um script "testa-arquivos", que pede ao usuário para digitar um arquivo e testa se este arquivo existe. Se sim, diz se é um arquivo ou um diretório.

---
CONCEITOS MAIS AVANÇADOS

If, for e while

Assim como qualquer outra linguagem de programação, o shell também tem estruturas para se fazer condicionais e loop. As mais usadas são if, for e while. Então daqui por diante, sabemos o básico, o necessário para se fazer um script de funcionalidade mínima. E este mínimo pode fazer coisas incríveis.

---
Base para escrever shell script com if, them, else e fi:

if COMANDO
then
comandos
else
comandos
fi

# fim do script

---
RODO ESTE SIMPLES SCRIPT QUE ESCREVI:

#!/usr/bin/env bash

# nome: if_then_else_fi_scr_contg.sh

contagem=1

if [ $contagem -eq 1 ]
then
echo
echo '*** Listando ***'
echo
ls -t | head
echo
echo '*** Onde estamos ***'
echo
pwd
echo
else
echo '*** Contagem não é 1 ***'
fi

---
Ex:

for VAR in LISTA
do
comandos
done

# fim do script

---
#!/usr/bin/env bash

# nome: exemplo_loop_for_test.sh

for f in .; do
echo '*** Listando ***'
ls -t | head
echo '*** Data atual ***'
date
done

# fim do script

---
while COMANDO
do
comandos
done

# fim do script

---
Diferente de outras linguagens, o if testa um comando e não uma condição. Porém como já conhecemos qual o comando do shell que testa condições, é só usá-lo em conjunto com o if. Por exemplo, para saber se uma variável é maior ou menor do que 10 e mostrar uma mensagem na tela informando:

---
Ex:

if test "$VARIAVEL" -gt 10
then
echo "é maior que 10"
else
echo "é menor que 10"
fi

# fim do script

---
Há um atalho para o test , que é o comando [. Ambos são exatamente o mesmo comando, porém usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens:

---
Ex:

if [ "$VARIAVEL" -gt 10 ]
then
echo "é maior que 10"
else
echo "é menor que 10"
fi

# fim do script

---
Se usar o [, também é preciso fechá-lo com o ], e sempre devem ter espaços ao redor. É recomendado evitar esta sintaxe para diminuir suas chances de erro.

---
Já o while é um laço que é executado enquanto um comando retorna OK. Novamente o test é bom de ser usado. Por exemplo, para segurar o processamento do script enquanto um arquivo de lock não é removido:

---
Ex:

while test -f /tmp/lock
do
echo "Script travado..."
sleep 1
done

# fim do script

---
Ex:

E por fim, o for percorre uma lista de palavras, pegando uma por vez:

for numero in um dois três quatro cinco
do
echo "Contando: $numero"
done

# fim do script

---
Uma ferramenta muito útil para usar com o for é o seq, que gera uma seqüência numérica.

---
Para fazer o loop andar 10 passos, pode-se fazer:

for passo in $(seq 10)

---
O mesmo pode ser feito com o while, usando um contador:

i=0
while test $i -le 10
do
i=$((i+1))
echo "Contando: $i"
done

# fim do script

---
Até Breve

:)

---

Linux o que é pipe? O que são pipes e como usar?

O que é um Pipe no Linux?

O Pipe é um comando usado em sistemas operacionais GNU/Linux que permite usar dois ou mais comandos, de forma que a saída de um comando sirva como entrada para o próximo.

Em resumo, a saída de cada processo diretamente como entrada para o próximo como um pipeline.

O símbolo ‘|’ denota um cano. Pipes ajudam a mash-up de dois ou mais comandos ao mesmo tempo e executá-los consecutivamente.

Você pode usar comandos poderosos que podem executar tarefas complexas em um instante.

Executo os comandos:

cd ~/Documentos/

mkdir -v TESTES

cd TESTES

touch nomedoarquivo.txt

echo -e “Morcego \nBat \nBode \napple \nGoat \nMaçã \nApple \nComer \nEat \neat \n9 Goat \n1 Eat \n4 Bat” > nomedoarquivo.txt

Vou entender isso com exemplos:

cat nomedoarquivo.txt | less (para sair teclo q)

cat nomedoarquivo.txt | pg (este não é muito usado)

cat nomedoarquivo.txt | more (este é o mais usado)

Resultado exemplo:

~/Documentos/TESTES:$ cat nomedoarquivo.txt | more
Morcego
Bat
Bode
apple
Goat
Maçã
Apple
Comer
Eat
eat
9 Goat
1 Eat
4 Bat
~/Documentos/TESTES:$

Quando você usa o comando ‘cat’ para exibir um arquivo que abrange várias páginas, o prompt salta rapidamente para a última página do arquivo e você não vê o conteúdo no meio. Para evitar isso, você pode canalizar a saída do comando ‘cat’ para ‘less’, que mostrará apenas um tamanho de rolagem de conteúdo por vez.

O comando grep é GNU. Execute:

grep –help

Relate os problemas para: bug-grep@gnu.org
página de GNU grep: <_ http://www.gnu.org=”www.gnu.org&#8221; software=”software” grep=”grep” _=”_”>
Ajuda geral sobre uso de software GNU: <_ http://www.gnu.org=”www.gnu.org&#8221; gethelp=”gethelp” _=”_”>

O comando grep:

grep ‘Apple’ nomedoarquivo.txt

Resultado é algo parecido com:

~/Documentos/TESTES:$ grep ‘Apple’ nomedoarquivo.txt
Apple
~/Documentos/TESTES:$

grep ‘Eat’ nomedoarquivo.txt

Resultado é algo parecido com:

~/Documentos/TESTES:$ grep ‘Eat’ nomedoarquivo.txt
Eat
~/Documentos/TESTES:$

Aqui, o comando grep pesquisou no arquivo a string ‘Apple’ e ‘Eat’.

As seguintes opções podem ser usadas com este comando.

Opção / Função (da opção): -v, -c, -n, -i, -l

A opção -v Tem a função de mostrar todas as linhas que não correspondem à sequência pesquisada,

Executo:
grep -v ‘Eat’ nomedoarquivo.txt

-c Exibe apenas a contagem de linhas correspondentes,

Executo:
grep -c ‘Eat’ nomedoarquivo.txt

-n Mostra a linha correspondente e seu número,

Executo:
grep -n ‘Eat’ nomedoarquivo.txt

-i Corresponde a maiúsculas e minúsculas,

Executo:
grep -i ‘Eat’ nomedoarquivo.txt

-l Mostra apenas o nome do arquivo com a sequência.

Executo:
grep -l ‘Eat’ nomedoarquivo.txt

Vamos tentar a primeira opção ‘-i’ no mesmo arquivo usado acima

grep -i ‘Bat’ nomedoarquivo.txt

Usando a opção ‘i’, o grep filtrou a string ‘a’ (sem distinção entre maiúsculas e minúsculas) de todas as linhas.

O comando ‘grep’ – Suponha que você queira pesquisar uma informação específica no código postal de um arquivo de texto. Você pode folhear manualmente o conteúdo para rastrear as informações. Uma opção melhor é usar o comando grep. Ele digitalizará o documento para obter as informações desejadas e apresentará o resultado no formato desejado. Sintaxe: grep search_string.

OBS:

Usando grep com o comando cat que também é GNU. Faz parte do pacote coreutils e sem o pacote coreutils nenhum sistema operacional gratúito baseado no kernel Linux funciona.

Imagine o que seria dos montes de scripts (códigos) escritos durante uns vinte anos até o dia de hoje, se os comandos do pacote coreutils fossem removidos?

Continuando:

cat nomedoarquivo.txt | grep -i a

Resultado é algo parecido com:

~/Documentos/TESTES:$ cat nomedoarquivo.txt | grep -i a
Bat
apple
Goat
Maçã
Apple
Eat
eat
~/Documentos/TESTES:$

Executo:

cat nomedoarquivo.txt | grep -v a

cat nomedoarquivo.txt | grep -c a

cat nomedoarquivo.txt | grep -n a

cat nomedoarquivo.txt | grep -l a

Resultado é algo parecido com:

~/Documentos/TESTES:$ cat nomedoarquivo.txt | grep -v a
Morcego
Bode
Apple
Comer
~/Documentos/TESTES:$ cat nomedoarquivo.txt | grep -c a
6
~/Documentos/TESTES:$ cat nomedoarquivo.txt | grep -n a
2:Bat
4:apple
5:Goat
6:Maçã
9:Eat
10:eat
~/Documentos/TESTES:$ cat nomedoarquivo.txt | grep -l a
(entrada padrão)
~/Documentos/TESTES:$

O comando ‘sort’ – Este comando ajuda a classificar o conteúdo de um arquivo em ordem alfabética. A sintaxe para este comando é:

sort nome-do-arquivo

Considere o conteúdo de um arquivo. Comando GNU/Linux/Unix, Grep & Sort – Usando o comando de classificação.

OBS:

O comando sort é GNU. Veja:

Página de ajuda do GNU coreutils: <_ http://www.gnu.org=”www.gnu.org&#8221; software=”software” coreutils=”coreutils” _=”_”>
Relate erros de tradução para <_ translationproject.org=”translationproject.org” team=”team” pt_br.html=”pt_br.html”>
Documentação completa em <_ http://www.gnu.org=”www.gnu.org&#8221; software=”software” coreutils=”coreutils” sort=”sort”>
ou disponível localmente via: info “(coreutils) sort invocation”

Executo o comando sort e o Resultado é algo parecido com:

~/Documentos/TESTES:$ sort nomedoarquivo.txt
apple
Apple
Bat
Bode
Comer
eat
Eat
Goat
Maçã
Morcego
~/Documentos/TESTES:$

O comando de classificação ‘sort’ possui três opções que podem ser usadas com ele e são listadas aqui. Opção – Função:

-r Inverte a classificação.
-n Classifica numericamente.
-f Classificação insensível a maiúsculas e minúsculas.

Executo:

sort -r nomedoarquivo.txt

sort -n nomedoarquivo.txt

sort -f nomedoarquivo.txt

Resultado é algo parecido com:

~/Documentos/TESTES:$ sort -r nomedoarquivo.txt
Morcego
Maçã
Goat
Eat
eat
Comer
Bode
Bat
Apple
apple
~/Documentos/TESTES:$ sort -n nomedoarquivo.txt
apple
Apple
Bat
Bode
Comer
eat
Eat
Goat
Maçã
Morcego
~/Documentos/TESTES:$ sort -f nomedoarquivo.txt
Apple
apple
Bat
Bode
Comer
eat
Eat
Goat
Maçã
Morcego
~/Documentos/TESTES:$

O que é um filtro? O Linux possui muitos comandos de filtro como awk, grep, sed, spell e wc. Um filtro recebe a entrada de um comando, faz algum processamento e fornece a saída. Quando você canaliza dois comandos, a saída “filtrada” do primeiro comando é fornecida para o próximo. Queremos destacar apenas as linhas que não contêm o caractere ‘a’, mas o resultado deve estar na ordem inversa. Para isso, a seguinte sintaxe pode ser usada:

cat nomedoarquivo.txt | grep -v a | sort – r

E para terminar lembro que:

Pipes (tubos) ‘|’ enviam a saída de um comando como entrada de outro comando. O filtro recebe a entrada de um comando, faz algum processamento e fornece a saída. O comando grep pode ser usado para encontrar cadeias e valores em um documento de texto. A canalização através do grep deve ser um dos comandos mais comuns.

O ‘sort’, classifica menos o conteúdo de um arquivo em ordem alfabética; comandos pg e more são usados para dividir um arquivo longo em bits legíveis. Tudo isso graças ao projeto GNU, que oferece o pacote coreutils gratuitamente a todos.

Não esqueço o Kernel Linux. Sem o Kernel o meu computador nem meu smartphone funcionariam. Sem o núcleo do GNU não existe um sistema gratuito do GNU/Linux. Ah e o meu smartphone também possui shell scripts que usam o pacote coreutils que permitem o seu ótimo funcionamento. O sistema Android usa o Kernel Linux alterado e usa também o pacote coreutils do projeto GNU.

Sem scripts não dá para o meu smartphone nem fazer chamadas telefônicas.

A base de tantas maravilhas do mundo atual bem aqui eu posso ver, escrever alguns scripts com funções, loops que funcionam (as vezes) e me divertem.

Linux script interativo

Um script interativo que cria para o diretório criado entra no dir criado, lista e exibe o caminho.

#!/usr/bin/env bash

# titulo: criar_dir_rn_file_mv_2_dir.sh
# autor:
# email:
# site:
# data: 26-03-2020_08:19:55
# distro:
# exemplo de uso: . ./criar_dir_rn_file_mv_2_dir.sh
# objetivo:
# variaveis:
# TODO – indica uma tarefa a ser feita
# FIXME – indica um bug conhecido que precisa ser arrumado
# XXX – Notícia, chama a atenção

ls -t | head -5
read -p “Digite o nome do diretório: ”
echo “Você digitou: $REPLY”
sleep 3
echo “Criando diretório $REPLY em 2 seg.”
sleep 2
mkdir “$REPLY”
echo “Diretório criado.”
sleep 2
ls -t | head -5
read -p “Digite o nome do velho arquivo: ” arquivo
echo “Você digitou: $arquivo”
sleep 3
read -p “Digite o nome do novo_arquivo: ” novo_arquivo
echo “Você digitou: $novo_arquivo”
sleep 3
echo “Alterando o nome do velho arquivo.”
sleep 3
mv “$arquivo” “$novo_arquivo”
echo “Arquivo alterado. Movendo arquivo para Diretório.”
sleep 3
mv “$novo_arquivo” “$REPLY”
echo “Movendo para diretório $REPLY”
cd “$REPLY”
echo “Listando e exibindo caminho”
ls -t | head -5
pwd

# testado. funciona.

# fim do script

Linux grep encontrar string em pasta dir

grep -rnw ‘/caminho/para/pasta/’ -e ‘palavras que procura’

grep -rnw “/home/user/bin/” -e “Digite”

Execute o seguinte:

grep -rnw ‘/caminho/para/pasta/’ -e ‘palavras que procura’

-r or -R é recursivo,
-n número da linha, e
-w busca pela palavra toda.
-l (minúsculas L) pode ser adicionado para fornecer apenas o nome do arquivo correspondente.

Junto com as bandeiras, –exclude, –include, –exclude-dir pode melhorar a busca usando asterisco (global) e chaves (global).

Abaixo a busca só será realizada nos arquivos que tiverem a extensão especificada:

grep –include=\*.{c,h} -rnw ‘/caminho/para/pasta/’ -e “palavras que procura”

grep –include=\*.{sh,c} -rnw ‘/caminho/para/pasta/’ -e “palavras que procura”

grep –include=*.sh -rnw “/home/user/bin/” -e “ogg”

grep –include=*.sh -rnw “/home/user/bin/” -e “eu só entendo”

grep -E –include=*.sh -rnw “/home/user/bin/” -e “eu só entendo”

Isso excluirá a pesquisa de todos os arquivos que terminam com a extensão .o:

grep –exclude=*.o -rnw ‘/caminho/para/pasta/’ -e “palavras que procura”

Para diretórios, é possível excluir um diretório específico através do parâmetro –exclude-dir. Por exemplo, isso excluirá os dirs dir1/, dir2/ e todos eles correspondentes *.dst/:

grep –exclude-dir={dir1,dir2,*.dst} -rnw ‘/caminho/para/pasta/’ -e “palavras que procura”

Para saber mais leia man grep.

Brincando com REGEX no Linux OS

Linux expressoes regulares mais exemplos. Vou usar grep e grep -E.

grep é um utilitário de linha de comando para procurar conjuntos de dados de texto simples para as linhas que correspondem a uma expressão regular.

grep [OPÇÕES] expressão_regular arquivo

grep -E [OPÇÕES] expressão_regular arquivo

Expressão Regular = texto/strings

Caracter Descrição REGEX
. Qualquer letra
^ início da linha
$ final da linha
[xyz] Qualquer das letras dentro dos colchetes
[^xyz] Qualquer letra fora as dentro dos colchetes
[t-z] Qualquer das letras entre t e z
z* Letra z zero ou mais vezes
z+ Letra z uma ou mais vezes
?{0,1} Pode aparecer ou não (opcional)
*{0,} Pode aparecer em qualquer quantidade
+{1,} Deve aparecer no mínimo uma vez
a{2} Casa a letra ‘a’ duas vezes
a{2,4} Casa a letra ‘a’ de duas a quatro vezes
a{2,} Casa a letra ‘a’ no mínimo duas vezes
.* Casa qualquer coisa, é o tudo e o nada
^ início da linha
$ final da linha
[abc] casa com os caracteres a, b e c
[a-c] casa com os caracteres a, b e c
[^abd] não casa com os caracteres a, b e d
(um|dois) casa com as palavras um e dois
Repetições
a{2} casa com a letra “a” duas vezes
a{2,5} casa com a letra “a” duas a cinco vezes
a{2,} casa com a letra “a” duas vezes ou mais
a? casa com “a” letra a zero vezes ou uma
a* casa com a letra “a” zeros vezes ou mais
a+ casa com a letra “a” uma vez ou mais

Curingas/Coringas – Arquivo/Pasta
. casa com qualquer caracter uma vez
.* casa com qualquer caracter várias vezes
(esse|aquele) Casa as palavras ‘esse’ ou ‘aquele’

Eu criei uma pasta chamada TESTES e nela um arquivo de texto chamado passwd. Leio o que tem nele:

TESTES:$ cat ~/TESTES/passwd

23/03/2020

user:dodo:6625:false
baba Shell:sese:shell
user:bash:shell:5959:bash
ipopi:bash:mumu:bash
bobob:bash:pepe:shell
lelel:shell:dede:bash
ododo:shell:Wewe:bash
lolol:Bash:dodo:shell
aveve:bash:Pepe:bash
ioio:bash:7694:false:bash
kekek:Shell:5813:false:bash
Aveve:bash:Pepe:4906:bash
user:false:popi:opepe:bash
dede:yuyu:popo:shell
vivi:55288:eionc:shell
linux:dada:ngng:8592:shell:bash
unix:drtdrt:bgfbgf:3856:shell
a1:eses:1524:uiop:bash
b2:rere:5143:poiu:shell
e3:wewe:2431:uiop:linux
r5:aeae:5134:poiu:bash
h4:gege:2435:uiop:unix
User:false:popi:opepe:bash

Exemplos

Procura a palavra user no arquivo ~/TESTES/passwd

~:$ grep user ~/TESTES/passwd

Procura todas as linhas começadas pela letra u no arquivo:

~:$ grep ‘^u’ ~/TESTES/passwd

Procura todas as linhas terminadas pela palavra false no arquivo:

~:$ grep ‘false$’ ~/TESTES/passwd

Procura todas as linhas começadas pelas vogais no arquivo:

~:$ grep ‘^[aeiou]’ ~/TESTES/passwd

Procura todas as linhas começadas por qualquer caracter e segundo caracter seja qualquer vogal no arquivo:

~:$ grep ‘^.[aeiou]’ ~/TESTES/passwd

Procura todas as linhas que contenham uma sequência de 4 números consecutivos:

~:$ grep ‘[0-9][0-9][0-9][0-9]’ ~/TESTES/passwd

Comando para encontrar linhas em branco:

~:$ grep ‘^$’ ~/TESTES/passwd

Encontrar e contar linhas em branco:

~:$ grep ‘^$’ ~/TESTES/passwd | wc -l

Encontrar mesmo nome, porém com letra inicial minúscula e maiúscula:

grep ‘[Uu]ser’ ~/TESTES/passwd

Encontrar 27 sequência ^ de 27 caracteres:

~:$ grep -E ‘^.{27}$’ ~/TESTES/passwd

Note que foi usado o grep -E e não o grep. É porque as chaves fazem parte de um conjunto avançado de Expressões Regulares (“extended”), então o grep -E lida melhor com elas. Se fosse para usar o grep normal, teria que “escapar” as chaves.

~:$ grep ‘^.\{27\}$’ ~/TESTES/’Linux shell script tomar decisoes.txt’

~:$ grep -E ‘^.{20,40}$’ ~/TESTES/passwd

Para obter as linhas que possuem 40 caracteres ou mais:

~:$ grep -E ‘^.{40,}$’ ~/TESTES/passwd

Econtrar números com 3 dígitos (de 0 a 9) ou mais:

grep -E ‘[0123456789]{3,}’ ~/TESTES/passwd

~:$ grep -E ‘[0123456789]{3,}’ ~/TESTES/passwd

Econtrar linhas que começam com ‘vogal minúscula’ e terminam com a palavra ‘bash’, usa−se o curinga “.*” para significar “qualquer coisa”(não confunda com “qualquer caracterer” somente “.”):

TESTES:$ grep -E ‘^[aeiou].*bash$’ ~/TESTES/passwd
ipopi bash:mumu bash
ododo shell:wewe bash
aveve bash:pepe bash

Procura linhas que comecem com a palavra ‘e3’ ou ‘vivi’ ou ‘user’:

grep -E ‘^(e3|vivi|user)’ ~/TESTES/passwd

Procura todas as linhas que NÃO comecem com a letra minúscula ‘m’

grep -E ‘^[^mumu]’ ~/TESTES/passwd

Continuo a brincar alterando exemplos.

Cola comandos:

Linux comando sed fácil

Linux comando sed fácil

---

Comando Sed no Linux com exemplos - o comando sed é um editor de fluxo e pode executar muitas funções em arquivos como, pesquisar, localizar e substituir, inserção ou exclusão. Embora o uso mais comum do comando sed seja para substituição ou para localizar e substituir. Usando o sed, você pode editar arquivos mesmo sem abri-lo, o que é uma maneira muito mais rápida de encontrar e substituir algo no arquivo, do que primeiro abrindo esse arquivo num editor de texto, por exemplo o vim e depois alterando-o.

---

O sed é um poderoso editor de fluxo de texto. Pode fazer inserção, exclusão, pesquisa e substituição. O comando sed suporta expressão regular, o que permite executar uma correspondência complexa de padrões.

---

Sintaxe:

sed OPÇÕES... [SCRIPT] [ARQUIVO DE ENTRADA...]

---

Verifique a versão do sed:

sed --version

---

Substituição básica de texto:

echo "Linguagem Bash Script" | sed 's/Bash/Perl/'

---

Resultado é algo parecido com isto:

~:$ echo "Linguagem Bash Script" | sed 's/Bash/Perl/'
Linguagem Perl Script
~:$

---

Comando:

echo 'Domingo' | sed 's/Domingo/Domingo é feriado/'

---

Resultado é algo parecido com isto:

~:$ echo 'Domingo' | sed 's/Domingo/Domingo é feriado/'
Domingo é feriado

---

Comando:

echo 'Segunda' | sed 's/Segunda/Segunda é dia comercial/'

---

Resultado é algo parecido com isto:

~:$ echo 'Segunda' | sed 's/Segunda/Segunda é dia comercial/'
Segunda é dia comercial

---

Executo:

echo 'Terça' | sed 's/Terça/Terça não é feriado/'

---

Resultado é algo parecido com isto:

~:$ echo 'Terça' | sed 's/Terça/Terça não é feriado/'
Terça não é feriado

---

Executo:

echo 'linux é um clone do unix mas é linux' | sed 's/unix/linux/'

echo 'linux é um clone do unix mas linux não é unix' | sed 's/unix/linux/'

---

Resultado:

~:$ echo 'linux é um clone do unix mas é linux' | sed 's/unix/linux/'
linux é um clone do linux mas é linux

~:$ echo 'linux é um clone do unix mas linux não é unix' | sed 's/unix/linux/'
linux é um clone do linux mas linux não é unix

---

Lembro que: por padrão, o comando sed substitui somente a primeira ocorrência do padrão em cada linha e não substitui a segunda, terceira ... ocorrência na linha.

---

E em um arquivo de texto em um diretório?

---

Crio um diretório para testes. Dentro deste diretório, crio um arquivo de texto .txt chamado de 'texto-teste-sed.txt' com o seguinte:

O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qualquer unix ou linux você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.
Segunda
Terça
Quarta
Quinta
Sexta
Sábado
Domingo

---

Dá para fazer isto pelo terminal:

cd

mkdir TESTES

cd TESTES

touch texto-teste-sed.txt

echo -e 'O unix é ótimo. \nO unix é de código aberto. \nunix é sistema operacional livre. \naprenda sistema operacional. \nunix linux qualquer unix ou linux você pode escolher. \nO unix é fácil de aprender. \no unix é um sistema operacional multiusuário. \nAprenda unix. \nO unix é uma ferramenta poderosa. \nOs sistemas Linux OS são ótimos. \nAproveite os sistemas Linux OS. \nSegunda \nTerça \nQuarta \nQuinta \nSexta \nSábado \nDomingo' > texto-teste-sed.txt

---

Como remover o espaço em branco do final das linhas?

Use um espaço em branco simples * ou [: blank:] * para remover todos os espaços possíveis no final da linha:

sed 's/ *$//' texto-teste-sed.txt

sed 's/[[:blank:]]*$//' texto-teste-sed.txt

---

Acontece muito:

Eu queria encontrar o texto chamado "foo" e substituído por "bar" no arquivo chamado "hosts.txt". Como uso o comando sed para localizar e substituir em sistemas Linux? O sed significa editor de stream. Ele lê o arquivo fornecido, modificando a entrada conforme especificado por uma lista de comandos sed. Por padrão, a entrada é gravada na tela, mas você pode forçar a atualização do arquivo.

O procedimento para alterar o texto em arquivos no Linux usando sed? Use o Stream EDitor (sed) da seguinte maneira:

sed -i 's/texto-antigo/novo-texto/g' texto-teste-sed.txt

O s é o comando substituto do sed para encontrar e substituir.
Ele diz ao sed para encontrar todas as ocorrências de 'texto antigo' e substituí-lo por 'novo texto' em um arquivo chamado input.txt.
Verifique se o arquivo foi atualizado:

more input.txt

---

Exemplo:

sed -i 's/Domingo/Bolhas/g' texto-teste-sed.txt

cat texto-teste-sed.txt

more texto-teste-sed.txt

---

Para deixar parecido com o que era antes:

sed -i 's/Bolhas/Domindo/g' texto-teste-sed.txt

cat texto-teste-sed.txt

more texto-teste-sed.txt

---

A sintaxe para encontrar e substituir textos usando sed?

sed 's/palavra1/palavra2/g' input.file

---

Como usar o sed para corresponder à palavra e executar encontrar e substituir? Neste exemplo, encontre apenas a palavra 'amor' e substitua-a por 'doente' se o conteúdo da linha for uma sequência específica, como FOO:

touch input.txt

echo -e "Amar é amor amor \nAmor é amar amor \nAmar é FOO amor amor" > input.txt

more input.txt

sed -i -e '/FOO/s/amor/doente/' input.txt

Para verificar as mudanças:

cat input.txt

---

Resultado:

~/bin:$ touch input.txt
~/bin:$ echo -e "Amar é amor amor \nAmor é amar amor \nAmar é FOO amor amor" > input.txt
~/bin:$ more input.txt
Amar é amor amor
Amor é amar amor
Amar é FOO amor amor
~/bin:$ sed -i -e '/FOO/s/amor/doente/' input.txt
~/bin:$ cat input.txt
Amar é amor amor
Amor é amar amor
Amar é FOO doente amor
~/bin:$

---

Substituindo ou sobrescrevendo uma string: o comando Sed é usado principalmente para substituir o texto em um arquivo. O comando sed simples abaixo substitui a palavra "unix" por "linux" no arquivo.

sed 's/unix/linux/' texto-teste-sed.txt

---

Aqui o "s" especifica a operação de substituição. Os "/" são delimitadores. O "unix" é o padrão de pesquisa e o "linux" é a string de substituição. Por padrão, como lembrei, o comando sed substitui a primeira ocorrência do padrão em cada linha e não substitui a segunda, terceira ... ocorrência na linha.

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qualquer unix ou linux você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo a nésima ocorrência de um padrão em uma linha: Use os sinalizadores /1, /2 etc para substituir a primeira e a segunda ocorrência de um padrão em uma linha. O comando abaixo substitui a segunda ocorrência da palavra "unix" por "linux" em uma linha.

sed 's/unix/linux/2' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/2' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo toda a ocorrência do padrão em uma linha: O sinalizador substituto /g (substituição global) especifica o comando sed para substituir todas as ocorrências da sequência na linha.

sed 's/unix/linux/g' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/g' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo da nésima ocorrência para todas as ocorrências em uma linha: Use a combinação de /1, /2 etc e /g para substituir todos os padrões da enésima ocorrência de um padrão em uma linha. O comando sed a seguir substitui a terceira, quarta, quinta ... palavra "unix" pela palavra "linux" em uma linha.

sed 's/unix/linux/3g' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/3g' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Parênteses no primeiro caractere de cada palavra: Este exemplo sed imprime o primeiro caractere de cada palavra entre parênteses.

echo "Bem Vindo Ao Semanickz Blog!" | sed 's/\(\b[A-Z]\)/\(\1\)/g'

---

Resultado é algo parecido com isto:

TESTES:$ echo "Bem Vindo Ao Semanickz Blog!" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
(B)em (V)indo (A)o (S)emanickz (B)log!
TESTES:$

---

Substituindo a sequência em um número de linha específico: Você pode restringir o comando sed para substituir a sequência em um número de linha específico. Um exemplo é:

sed '3 s/unix/linux/' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '3 s/unix/linux/' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Duplicar a linha substituída com o sinalizador / p: O sinalizador de impressão / p imprime a linha substituída duas vezes no terminal. Se uma linha não possui o padrão de pesquisa e não é substituída, o / p imprime essa linha apenas uma vez.

sed 's/unix/linux/p' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/p' texto-teste-sed.txt
O linux é ótimo.
O linux é ótimo.
O linux é de código aberto.
O linux é de código aberto.
linux é sistema operacional livre.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
o linux é um sistema operacional multiusuário.
Aprenda linux.
Aprenda linux.
O linux é uma ferramenta poderosa.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
TESTES:$

---

Imprimindo apenas as linhas substituídas: Use a opção -n junto com o sinalizador de impressão / p para exibir apenas as linhas substituídas. Aqui, a opção -n suprime as linhas duplicadas geradas pelo sinalizador / p e imprime as linhas substituídas apenas uma vez.

sed -n 's/unix/linux/p' texto-teste-sed.txt

OBS:
Se você usar -n sozinho sem /p, o sed não imprimirá nada.

---

Resultado é algo parecido com isto:

TESTES:$ sed -n 's/unix/linux/p' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
TESTES:$

---

Substituindo a sequência em um intervalo de linhas: Você pode especificar um intervalo de números de linhas no comando sed para substituir uma sequência.

sed '1,3 s/unix/linux/' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '1,3 s/unix/linux/' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Aqui, o comando sed substitui as linhas com intervalo de 1 a 3.

sed '2,$ s/unix/linux/' texto-teste-sed.txt

OBS:
Aqui $ indica a última linha do arquivo. Portanto, o comando sed substitui o texto da segunda linha para a última linha no arquivo.

---

TESTES:$ sed '2,$ s/unix/linux/' texto-teste-sed.txt
O unix é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Excluindo linhas de um arquivo específico: o comando SED também pode ser usado para excluir linhas de um arquivo específico. O comando SED é usado para executar a operação de exclusão sem abrir o arquivo. Exemplo:

sed '5d' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '5d' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Para deletar a última linha:

sed '$d' texto-teste-sed.txt

---

Para excluir uma linha do intervalo x até y

sed '3,6d' texto-teste-sed.txt

---

Para excluir da enésima até a última linha

sed '12,$d' texto-teste-sed.txt

---

Para excluir a linha correspondente de padrão

sed '/abc/d' texto-teste-sed.txt

---

É interessante de ler a man page do sed. Praticar alterando estes exemplos em outros arquivos de texto que criar.

---

Linux expressões regulares REGEX fácil

O jeito fácil de aprender REGEX

Aprendendo expressões regulares.

A melhor maneira de aprender expressões regulares é experimentar os exemplos e modificá-los um pouco para testar sua compreensão. É comum cometer erros em seus padrões enquanto você está aprendendo. Quando isso acontece, normalmente todas as linhas serão correspondidas ou nenhuma linha será correspondida ou algum conjunto obscuro. Não se preocupe se isso acontecer, você não causou nenhum dano e pode facilmente voltar e tentar outra vez. Lembre-se de que você pode pressionar a seta para cima no teclado para obter seus comandos recentes e também modificá-los para que você não precise digitar novamente o comando todo o tempo.

Se você não está obtendo o resultado desejado, aqui estão algumas estratégias básicas.

Primeiro, verifique se há erros de digitação. Se você é como eu, então você está propenso a fazê-los. Leia novamente o conteúdo aqui. Talvez o que você pensou que um operador em particular fez tenha sido ligeiramente diferente do que realmente faz e, ao ler, você notará um ponto que pode ter perdido na primeira vez. Divida seu padrão em componentes individuais e teste cada um deles individualmente. Isso ajudará você a ter uma idéia de quais partes do padrão estão corretas e quais partes você precisa ajustar.

VISÃO GERAL DA EXPRESSÃO REGULAR

. (ponto) – um único caractere.

? – o caractere anterior corresponde apenas a 0 ou 1 vezes.

* – o caractere anterior corresponde a 0 ou mais vezes.

+ – o caractere anterior corresponde 1 ou mais vezes.

{n} – o caractere anterior corresponde exatamente n vezes.

{n, m} – o caractere anterior corresponde pelo menos n vezes e não mais que m vezes.

[agd] – o caractere é um daqueles incluídos entre colchetes.

[^ agd] – o caractere não é um daqueles incluídos entre colchetes.

[c-f] – o traço entre colchetes funciona como um intervalo. Nesse caso, significa as letras c, d, e ou f.

() – permite agrupar vários caracteres para se comportar como um.

| (símbolo do tubo/pipe) – a operação lógica OR.

^ – corresponde ao início da linha.

$ – corresponde ao final da linha.

Crio uma TESTES e dentro dela um texto-teste.txt. O texto-teste.txt vai conter:

Lago seco 4
Rua Berta 7
Ana Mabra 7
Greg Sila 3
# Bom Dia!
# Boa Tarde!
# Boa Noite!
# Usuário Linux
1- Ele usa Linux
2- Ela usa Linux
3- Nós usamos Linux
1 – Vita:1508:TESTE1:Novo1
2 – Vita:1509:TESTE2:Novo2
3 – Vita:1509:TESTE3:Novo3
Vitas:1518:TESTE1:Novo:1
Vitas:1529:TESTE2:Novo:2
Vitas:1539:TESTE3:Novo:3
Plutão Marte Saturno
Pera Uva Maçã Banana
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

Comece com algo simples. Digamos que desejamos identificar qualquer linha com duas ou mais vogais seguidas. No exemplo abaixo, o multiplicador {2,} se aplica ao item anterior, que é o intervalo.

egrep ‘[aeiou]{2,}’ texto-teste.txt

grep -E ‘[aeiou]{2,}’ texto-teste.txt

Resultado:

TESTES:$ grep -E ‘[aeiou]{2,}’ texto-teste.txt
Rua Berta 7
# Bom Dia!
# Boa Tarde!
# Boa Noite!
# Usuário Linux
TESTES:$

egrep ‘2.+’ texto-teste.txt

grep -E ‘2.+’ texto-teste.txt

Resultado:

TESTES:$ egrep ‘2.+’ texto-teste.txt
2- Ela usa Linux
2 – Vita:1509:TESTE2:Novo2
Vitas:1529:TESTE2:Novo:2

egrep ‘2$’ texto-teste.txt

grep -E ‘2$’ texto-teste.txt

Resultado:
ff
TESTES:$ grep -E ‘2$’ texto-teste.txt
2 – Vita:1509:TESTE2:Novo2
Vitas:1529:TESTE2:Novo:2
TESTES:$

egrep ‘na|ia|no’ texto-teste.txt

grep -E ‘na|ia|no’ texto-teste.txt

Resultados:

TESTES:$ egrep ‘na|ia|no’ texto-teste.txt
Ana Mabra 7
# Bom Dia!
Plutão Marte Saturno
Pera Uva Maçã Banana

TESTES:$ grep -E ‘na|ia|no’ texto-teste.txt
Ana Mabra 7
# Bom Dia!
Plutão Marte Saturno
Pera Uva Maçã Banana
TESTES:$

egrep ‘^[A-K]’ texto-teste.txt

grep -E ‘^[A-K]’ texto-teste.txt

Resultado:

TESTES:$ grep -E ‘^[A-K]’ texto-teste.txt
Ana Mabra 7
Greg Sila 3
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

TESTES:$ egrep ‘^[A-K]’ texto-teste.txt
Ana Mabra 7
Greg Sila 3
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

Agora é criar um arquivo similar e ir brincando reformulando os exemplos.

Dar uma lida na man page do grep e do egrep e usar o que leu.

Praticar sempre que puder diariamente por uma ou duas semanas.

Tenha sempre ao seu lado a VISÃO GERAL DA EXPRESSÃO REGULAR

Assim é que aprende. Praticando todos os dias, em 15 dias (no máximo) provavelmente, já vai saber o suficiente para brincar com o REGEX usando os comandos sed e awk.

Linux comando grep exemplos simples

O comando Grep no Unix/Linux é uma ferramenta poderosa que procura combinar uma expressão regular com o texto em um arquivo, vários arquivos ou um fluxo de entrada. Ele procura o padrão de texto que você especifica na linha de comando e imprime a saída para você. Além disso, três programas variantes egrep, fgrep e rgrep estão disponíveis.

1) egrep é o mesmo que grep -E
2) fgrep é o mesmo que grep -F
3) rgrep é o mesmo que grep -r

A chamada direta do egrep ou do fgrep foi descontinuada, mas é fornecida para permitir que aplicativos históricos que dependem deles sejam executados sem modificação.

Exemplo de comando grep no Unix/Linux: digamos se você deseja pesquisar rapidamente a string linux nos arquivos .html da sua máquina? Aqui, nossa string PATTERN é “linux” e nosso FILE é index.html

Procure uma string “linux” em um arquivo usando o comando grep. Este é o uso básico do comando grep. Ele procura a sequência especificada no arquivo especificado.

grep “linux” index.html

Pesquisa de caso insensível com grep -i. O comando grep abaixo procura por palavras como “LINUX”, “Linux”, “linux” maiúsculas e minúsculas.

grep -i “linux” index.html

Procurando por uma sequência em vários arquivos. Este comando procurará a string “linux” em vários arquivos ao mesmo tempo. Ele pesquisa em todos os arquivos com file1.txt, file2.txt e em diferentes extensões, como file1.html, file2.php e assim por diante.

grep “linux” file*.*

Especificando a sequência de pesquisa como um padrão de expressão regular. É um recurso muito poderoso e pode ser usado como uma expressão regular com muita eficácia. No exemplo abaixo, ele procura por todo o padrão que começa com “fast” e termina com “host” com qualquer coisa intermediária. ou seja, para pesquisar “rapidamente [qualquer coisa no meio] host” no arquivo index.html.

grep “fast.*host” index.html

Procurar no diretório atual somente por arquivos .mp3

find . –name “*.mp3” | grep –i artista | grep –vi “love”

Exibindo os números de linha. Você pode usar este comando grep para exibir o número da linha que contém a sequência correspondente em um arquivo usando a opção -n.

grep -n “palavra*” file.txt

Destacando a pesquisa usando grep. Se usarmos a opção –color, nossas correspondências bem-sucedidas serão destacadas para nós.

grep –color “linux” index.html

Imprima a linha excluindo o padrão usando a opção -v. Liste todas as linhas do arquivo /etc/passwd que não contêm a palavra específica “string”.

grep -v linux /etc/passwd

Remover todas as linhas comentadas? Bem, você pode! Basta executar o seguinte:

grep -v “#” ~/.bashrc

grep -v “#” ~/bin/meu_velho_script.sh

PODE MANDAR A SAÍDA PARA UM ARQUIVO:

grep -v “#” ~/.bashrc > arq_bashrc_sem_coments.txt

grep -v “#” ~/bin/meu_velho_script.sh > velho_script_sem_coment.txt

Exiba todas as linhas que começam com o padrão especificado usando o símbolo ^. O Bash shell trata o símbolo da cenoura (^) como um caractere especial que é tratado como o início da linha. Vamos exibir as linhas que começam com a palavra “raiz” no arquivo /etc/passwd.

grep ^root /etc/passwd

Exiba todas as linhas que terminam com o padrão especificado usando o símbolo $. Liste todas as linhas de /etc/passwd que terminam com a palavra “bash”.

grep bash$ /etc/passwd

Pesquise o padrão recursivamente usando a opção -r. O comando abaixo pesquisará o linux no diretório “/etc” recursivamente.

grep -r linux /etc/

Contando as linhas quando as palavras coincidem. Este comando grep pode relatar o número de vezes que o padrão corresponde a cada arquivo usando a opção -c (count).

grep -c ‘test’ ~/TESTE/test.txt

Conclusão:

Você já foi confrontado com a tarefa de procurar uma determinada sequência ou padrão em um arquivo, mas não tem idéia por onde começar a procurar? Bem, então, aqui está grep para o resgate! Já dá para ter uma idéia do uso básico do comando grep com diferentes padrões de busca. O comando grep é bem útil para quem tem/trabalha com servidor(es) Linux. Mas pode ser útil até mesmo em casa no seu dia-dia.

Linux aprender comando find para usar em shell scripts

Linux o que é o comando find?

Um dos mais importantes e usados comandos da linha de comando em sistemas operacionais Linux é o find.

Para que serve o comando find?

O find (localização) pode ser usado em várias condições. Posso encontrar arquivos por permissões, usuários, grupos, tipo de arquivo, data, tamanho e outros critérios.

Aprender o comando find?

Para aprender, o modo mais seguro é criar uma pasta na pasta pessoal chamada TESTE. Ela servirá para realizar os estudos. Criar na pasta TESTE arquivos:

texto.txt
Texto.doc
texto
texto4.docx
texto.html
postado.html
musica.mp3
mucic
video.mkv
Video.mp4
video.avi
Video
script.sh
script2.sh
script
img.jpg
imge.png
imagem.jpeg
img
arq.pdf
arquivo.epub
arq
bkp.zip
back.tar
bkp.old.tgz
bkp
teste.txt
test.txt
test
script.c
script2.c
script

Atenção!

1) Não execute nenhum comando como root.

2) Não use sudo em nenhum comando.

3) Tenha backup de todos os seus arquivos. Quem tem 1 backup não tem nenhum.

Para serem localizados pelo comando find usando vários critérios.

Iniciar os estudos.

Encontrar arquivos na pasta onde está é com ponto -name. Exemplo:

find . -name texto.txt

Encontrar arquivos na pasta pessoal:

find ~/ -name Texto.txt

Localizar arquivos usando nome e ignorando maiúsculas e minúsculas:

find . -iname texto.txt

find ~/TESTE/ -iname video.mkv

Encontrar diretórios usando -name:

find ~/ -type d -name TESTE

Encontrar arquivos usando ponto -type f -name:

find . -type f -name bkp*

Encontrar todos os arquivos txt no diretório/pasta/folder TESTE:

find . -type f -name “*.txt”

Encontrar arquivos com permissão 777:

find . -type f -perm 0777 -print

Encontrar arquivos sem permissão 777:

find / -type f ! -perm 777

Localizar todos os arquivos de bit SGID cujas permissões estão definidas para 644:

find / -perm 2644

Encontrar todos os arquivos de conjunto de bits fixos cuja permissão seja 551:

find / -perm 1551

Encontrar todos os arquivos de conjunto SGID:

find / -perm /g=s

Encontrar todos os arquivos executáveis:

find / -perm /a=x

Localizar todos os arquivos de permissão 777 e usar o comando chmod para definir as permissões para 644.

find / -type f -perm 0777 -print -exec chmod 644 {} \;

Encontrar todos os diretórios de permissão 777 e usar o comando chmod para definir as permissões para 755.

find / -type d -perm 777 -print -exec chmod 755 {} \;

Para localizar e remover em TESTE vários arquivos, como .mp3 ou .txt, use.

find . -type f -name “*.txt” -exec rm -f {} \;

OR

find . -type f -name “*.mp3” -exec rm -f {} \;

Encontrar todos os diretórios vazios:

find /tmp -type d -empty

Encontrar todos os arquivos que pertencem ao usuário eu.

find ~/ -user eu

Para encontrar todos os arquivos que pertencem ao grupo Developer no diretório /home.

find /home -group developer

Encontrar todos os .txt do usuário eu na pasta home:

find /home -user eu -iname “*.txt”

Encontrar todos os arquivos modificados 60 dias atras.

find / -mtime 60

Encontrar os modificados 25 dias atrás.

find / -atime 25

Para encontrar todos os arquivos que foram alterados/movido na última 1 hora.

find / -cmin -60

Arquivos trabalhados na última 1 hora.

find / -amin -60

Encontrar arquivos de 50MB

find / -size 50M

Arquivos entre 50 e 100MB

find / -size +50M -size -100M

Encontrar e deletar arquivos de 100MB (cuidado!).

find / -type f -size +100M -exec rm -f {} \;

Encontrar e deletar mp3 com mais de 10MB! mp3 bom pra eu tem de 3 a 5MB. O resto é perda de espaço no HD. Ora, foi pra isto que o mp3 foi criado poxa! Pequeno.

find / -type f -name *.mp3 -size +10M -exec rm {} \;

Linux usar o comando basename de maneira produtiva

O que é basename?

Quando você fornece uma string que contém um nome de arquivo, o caminho completo é removido, o comando basename remove apenas a parte do diretório e retorna apenas a parte do nome de arquivo dessa string.
Também pode remover a extensão do arquivo e retornar apenas o nome do arquivo sem uma extensão.

Exemplos de basename:

1- basename quando não houver extensão de arquivo. Nome de base (basename) remove o caminho e exibe apenas o nome do arquivo. Por exemplo, o nome base de /etc/passwd é “passwd”, como mostrado abaixo.

~:$ basename /etc/passwd
passwd

Mas pode ser absolutamente qualquer coisa! Basename topa tudo!

~:$ basename /canto/passaro
passaro

~:$ basename /canto/passaro/escuro
escuro

~:$ basename /pedra/papel/tesoura
tesoura

Basename topa tudo, mas quando trabalha uma extensão de arquivo tem um algo mais. Quando o nome do arquivo contém uma extensão, o basename remove o caminho e RETORNA O NOME DO ARQUIVO COM A EXTENSÃO. Veja bem isto é importante, vou repetir. O basename RETORNA O NOME DO ARQUIVO COM A EXTENSÃO.

OBS:
Este é um dos motivos para o comando basename ser extremamente útil em shell scripts.

~:$ basename /usr/local/apache2/conf/httpd.conf
httpd.conf

O basename pode também obter apenas o nome de um arquivo sem extensão. Se você deseja obter apenas o nome do arquivo sem a extensão, deve passar a extensão como segundo argumento para o comando basename, como mostrado abaixo. O exemplo a seguir retornará apenas httpd, pois o segundo argumento para o comando basename é .conf

~:$ basename /usr/local/apache2/conf/MeuDiaFeliz.conf .conf
MeuDiaFeliz

~:$ basename qualquer/coisa/babba.bruck .bruck
babba

~:$ basename -s .txt /home/user/data/filename.txt
filename

~:$ basename -s .burro_brabo /saturno/estrela/truta/mula_manca.burro_brabo
mula_manca

Se você fornecer um sufixo que não esteja no final do componente, a saída permanecerá como se não houvesse sufixo.

~:$ basename /dudada/nene/pipopi/gellid.txt pwd
gellid.txt

Com a opção -a, você pode usar vários caminhos ao mesmo tempo.

~:$ basename -a /predio/mato/avenida/caspa.doc /selo/caca/peixe/belko.txt
caspa.doc
belko.txt

Você pode usar a opção de sufixo -s com -a, mas com algumas limitações. Você pode fornecer apenas um sufixo para todos os caminhos de arquivo.

~:$ basename -as .sh /homer/usor/detta/filename1.sh /hoome/usero/dalta/filename2.sh
filename1
filename2

O basename se relaciona bem com os comados dirname e readlink mas só na hora do sufoco a gente dá valor ao basename. Sabia? Nem eu.

Até agora parece que só perdi tempo escrevendo sobre o basename, mas não o subestime. Ele é mais importante do que pensa.

USANDO BASENAME NO BASH SCRIPT

Eu mostrei alguns exemplos do comando basename. Vamos ver alguns exemplos de nome de base nos scripts bash. É aqui que ele mostra seu valor!

Suponha que você tenha uma VARIÁVEL DE CAMINHO DO ARQUIVO e DESEJE ARMAZENAR o NOME DO ARQUIVO do caminho em uma VARIÁVEL.

Poderia ser neste script simples abaixo:

pathname=”~/bin/favoritos/meu_arquivo2.txt”

result=$(basename “$pathname”)

echo $result

Execução:

~:$ pathname=”~/bin/favoritos/meu_arquivo2.txt”
~:$ result=$(basename “$pathname”)
~:$ echo $result
meu_arquivo2.txt

AGORA USA O BASENAME COM O PROPÓSITO DE SUBSTITUIR EXTENSÃO DE ARQUIVOS DE VERDADE.

PRIMEIRO CRIAR UM DIRETÓRIO TESTE. E EXECUTAR O SCRIPT ABAIXO NELE.

Executo no terminal:

cd ; mkdir -pv TESTES/Test2 ; cd TESTES/ ; touch file.txt file.doc file.html ; ls -t

OBSERVE QUE MARQUEI SE É UM ARQUIVO OU NÃO NO SCRIPT BASH PARA QUE ELE NÃO MUDE UM DIRETÓRIO CORRESPONDENTE.

SCRIPT BASENAME COM O PROPÓSITO DE SUBSTITUIR EXTENSÃO DE ARQUIVOS

#!/usr/bin/env bash

# test_basename.sh

for file in *$1; do
if [ -f $file ]; then
mv $file `basename $file .$1`.$2
fi
done

# fim do script

Uso o script acima assim:

1) test_basename.sh txt TxT

2) test_basename.sh doc DOc

3) test_basename.sh html MatildE

Veja só os resultados legais:

TESTES:$ test_basename.sh txt TxT
TESTES:$ ls -t
file.doc file.TxT texto1.TxT Texto3.TxT TEXTO4.TxT
file.html sample.TxT texto2.TxT texto4.TxT Texto3
TESTES:$ test_basename.sh doc DOc
TESTES:$ ls -t
file.DOc file.TxT texto1.TxT Texto3.TxT TEXTO4.TxT
file.html sample.TxT texto2.TxT texto4.TxT Texto3
TESTES:$ test_basename.sh html MatildE
TESTES:$ ls -t
file.DOc file.TxT texto1.TxT Texto3.TxT TEXTO4.TxT
file.MatildE sample.TxT texto2.TxT texto4.TxT Texto3
TESTES:$

ONELINER?

for file in *$1; do; if [ -f $file ]; then; mv $file `basename $file .$1`.$2; fi; done

Parâmetros especiais do Bash explicados com exemplos de shell script

Alguns dos parâmetros especiais do bash são:

$*, $@, $#, $$, $!, $?, $-, $_

Mas antes…
Os parâmetros posicionais começam no parâmetro 0. O parâmetro “$0” refere-se ao nome do programa que iniciou o bash ou ao nome do shell script caso a função esteja sendo executada dentro de um shell script. Consulte as páginas do manual do bash para obter informações sobre outras possibilidades, por exemplo, quando o bash inicia com o parâmetro -c . Uma cadeia de caractere entre aspas simples ou duplas será passada como um único parâmetro e as aspas serão removidas. No caso de aspas duplas, as variáveis de shell como $HOME serão expandidas antes de chamar a função. Será necessário usar aspas simples ou duplas para passar parâmetros que contenham espaços vazios integrados ou outros caracteres que possam ter um significado especial para o shell.

Os parâmetros especiais $* e $@ fora das aspas duplas, essas duas são equivalentes.

“$*” ela será uma única palavra com o primeiro caractere da variável especial IFS separando os parâmetros ou nenhum espaço de intervenção caso IFS seja nula.

“$@” utilize essa forma caso seja provável que seus parâmetros contenham espaços vazios integrados.

“$#” O número de parâmetros, sem incluir o parâmetro 0.

$* e $@ ambas se expandem para a lista de parâmetros posicionais começando com $1 (separados por espaços).

Entre aspas duplas, no entanto, elas diferem:

$* dentro de um par de aspas duplas é equivalente à lista de parâmetros posicionais, separados pelo primeiro caractere do IFS “$1c $2c $3 …”.

$@ dentro de um par de aspas duplas é equivalente à lista de parâmetros posicionais, separados por espaços sem aspas, ou seja, “$1” “$2 ″..”$N”.

PODEMOS USAR BASH $* e $@ para expandir os parâmetros posicionais. Exemplo abaixo:

#!/usr/bin/env bash

export IFS=’-‘

cnt=1

# Imprimir os dados disponíveis em $*

echo “Valores de \”\$*\”:”
for arg in “$*” # olha aí o loop for
do
echo “Arg #$cnt= $arg”
let “cnt+=1”
done

cnt=1

# Imprimir os dados disponíveis em $@

echo “Valores de \”\$@\”:”
for arg in “$@” # olha aí o loop for de novo
do
echo “Arg #$cnt= $arg”
let “cnt+=1”
done

Em seguida, execute o expan.sh como mostrado abaixo para ver como $* e $@ funcionam.

$ ./expan.sh “Este é” 2 3

O SCRIPT ACIMA exportou o valor do IFS (Internal Field Separator) com o ‘-‘.

Existem três parâmetros passados para o script expan.sh $1=”Isto é”, $2=”2″ e $3=”3″.

Ao imprimir cada valor do parâmetro especial “$*”, ele fornece apenas um valor que é todo o parâmetro posicional delimitado pelo IFS.

Use $# para contar parâmetros posicionais. $# é o parâmetro especial no bash que fornece o número do parâmetro posicional em decimal.

Primeiro, crie o arithmetic.sh como mostrado abaixo.

#!/bin/bash

# nome: arithmetic.sh

if [ $# -lt 2 ] # uso do if, then, fi
then
echo “Uso: $0 arg1 arg2”
exit
fi

echo -e “\$1=$1” # uso do echo -e
echo -e “\$2=$2”

let add=$1+$2 # uso do let para calcular $1 e $2
let sub=$1-$2
let mul=$1*$2
let div=$1/$2

echo -e “Adição=$add \nSubtração=$sub \nMultiplicação=$mul \nDivisão=$div \n”

OBS:

Se o número de parâmetros posicionais for menor que 2, ele lançará as informações de uso, como mostrado abaixo.

$ ./arithemetic.sh 10
Uso: ./arithemetic.sh arg1 arg2

Parâmetros relacionados ao processo – $$ e $!

O parâmetro especial $$ fornecerá o ID do processo do shell.

$! fornece o ID do processo em segundo plano executado mais recentemente.

O script a seguir imprime o ID do processo do shell e o último ID do processo de execução em segundo plano.

#!/bin/bash

# nome: proc.sh

echo -e “Processo ID=$$”

sleep 1000 &

echo -e “Processo em Segundo Plano ID=$!”

Agora, execute o script acima e verifique a identificação do processo que está sendo impresso. Exemplo:

~:$ proc.sh
Processo ID=29453
Processo em Segundo Plano ID=29454

Other Bash Special Parameters – $?, $-, $_ / $? Gives the exit status of the most recently executed command. / $- Options set using set builtin command / $_ Gives the last argument to the previous command. At the shell startup, it gives the absolute filename of the shell script being executed. / $ cat others.sh

Outros parâmetros especiais do Bash – $ ?, $ -, $ _

$? Dá o status de saída do comando executado mais recentemente.

$ – Conjunto de opções usando o comando set builtin

$ _ Dá o último argumento ao comando anterior. Na inicialização do shell, fornece o nome do arquivo absoluto do script de shell sendo executado.

#!/bin/bash

# nome: others.sh

echo -e “$_”; ## Nome absoluto do arquivo que está sendo executado

/usr/local/bin/dbhome # execute the command.

# verifique o status de saída de dbhome

if [ “$?” -ne “0” ]; then
echo “Desculpe, a execução do comando falhou !”
fi

echo -e “$-“; # Defina opções – hB

echo -e $_ # Último argumento do comando anterior.

No script acima, a última declaração de eco “echo -e $_” ($ underscore) também imprime hB, que é o valor do último argumento do comando anterior. Então $_ dará o valor após a expansão.

~:$ others.sh
/home/user/bin/others.sh
/home/user/bin/others.sh: linha 7: /usr/local/bin/dbhome: Arquivo ou diretório inexistente
Desculpe, a execução do comando falhou !
hB
hB

Observação: Caso tenha mais de 9 parâmetros, não é possível usar $10 para se referir ao décimo. É necessário primeiramente processar ou salvar o primeiro parâmetro ($1), depois usar o comando shift para eliminar o parâmetro 1 e diminuir a posição de todos os parâmetros restantes para que $10 se torne $9 e assim por diante. O valor de $# será atualizado para refletir o número restante de parâmetros. Na prática, na maioria das vezes, você fará a iteração dos parâmetros para uma função ou shell script ou, ainda, para uma lista criada por substituição de comando usando uma declaração para ; portanto, essa restrição raramente constitui um problema.
Os shell scripts manipulam os parâmetros da mesma maneira que as funções. Na realidade, você frequentemente montará scripts a partir de muitas funções pequenas.

Linux browser w3m navegar na web pelo terminal

Navegar na web pelo terminal?

O W3M é um navegador de terminal para Linux. Ele tem alguns truques na manga, incluindo suporte para imagens, guias, tabelas, molduras e outros recursos que normalmente não estão incluídos nos navegadores da web dos terminais onde na web tudo é em modo texto, muito leve e rápido.

Estes navegadores modo texto remontam o início da internet, são antigos mas, recebem manutenção/atulização até hoje. Qualquer usuário linux acha terminal web browser para instalar no sistema. O mais antigo ainda em atividade, dizem ser o terminal web browser Lynx criado em 1992 porém, o w3m também é das antigas 1995.

Se você usa o Linux há algum tempo, provavelmente se lembra de usar um navegador de terminal para pesquisar no uma solução para o seu hardware quando o servidor X se recusou a carregar. Os servidores X modernos avançaram muito além disso, mas o W3M e outros navegadores de terminal ainda podem ser úteis. Instale o w3m pelo software center do seu sistema operacional.

Modo de uso:

w3m [opções] [URL ou arquivo]

w3m duckduckgo.com

Navegação básica – O W3M possui algumas opções de linha de comando, mas nenhuma é obrigatória. A única coisa que você precisa especificar é um endereço de página da web. Deseja abrir algum buscador? Basta usar o comando:

1- w3m duckduckgo.com
2- w3m start.duckduckgo.com
3- w3m google.com

Você pode usar as teclas de seta para mover o cursor ou clicar no local desejado para mover o cursor para lá.

Se você deseja digitar uma caixa de texto, selecione a caixa de texto com o cursor e PRESSIONE ENTER ANTES DE DIGITAR O TEXTO. O W3M trata as teclas pressionadas como comandos se você começar a digitar.

Carregue um hiperlink selecionando-o com o cursor e pressionando Enter.

Você não precisa selecionar os hiperlinks manualmente – pressione a tecla Tab para posicionar o cursor sobre o próximo hiperlink na página.

Shift-B retornará uma página.

Se você deseja carregar um URL diferente, pressione Shift-U e você receberá um prompt de URL.

Pressione Shift-H para visualizar a página de ajuda, se você quiser ver uma lista mais completa de atalhos de teclado.

O W3M suporta imagens, então onde elas estão? Bem, terminais como o gnome terminal e o konsole do kde não podem exibir as imagens do W3M.

Outros terminais, como o Xterm, podem. O W3M também exibirá imagens se você estiver executando em um console de buffer de quadros, portanto, não é necessário um servidor X em execução para aproveitar esse recurso.

Outro recurso que não funciona no gnome terminal ou no konsole é o menu do botão direito do mouse do W3M.

COMO NÓS VIVEMOS SEM ABAS?

Elas são um recurso essencial para navegadores da web. O W3M também inclui abas.

Basta pressionar Shift-T para abrir uma nova aba.

Você pode alternar entre as guias clicando nelas, mas estamos tentando ser ninjas terminais aqui.

Use as teclas {e} para alternar entre as guias sem tocar no mouse (que é Shift- [e Shift-]).

Direto da man page do w3m (w3m –help):

options:
-t tab set tab width
-r ignore backspace effect
-l line # of preserved line (default 10000)
-I charset document charset
-O charset display/output charset
-B load bookmark
-bookmark file specify bookmark file
-T type specify content-type
-m internet message mode
-v visual startup mode
-M monochrome display
-N open URL of command line on each new tab
-F automatically render frames
-cols width specify column width (used with -dump)
-ppc count specify the number of pixels per character (4.0…32.0)
-ppl count specify the number of pixels per line (4.0…64.0)
-dump dump formatted page into stdout
-dump_head dump response of HEAD request into stdout
-dump_source dump page source into stdout
-dump_both dump HEAD and source into stdout
-dump_extra dump HEAD, source, and extra information into stdout
-post file use POST method with file content
-header string insert string as a header
+ goto line
-num show line number
-no-proxy don’t use proxy
-4 IPv4 only (-o dns_order=4)
-6 IPv6 only (-o dns_order=6)
-no-mouse don’t use mouse
-cookie use cookie (-no-cookie: don’t use cookie)
-graph use DEC special graphics for border of table and menu
-no-graph use ASCII character for border of table and menu
-s squeeze multiple blank lines
-W toggle search wrap mode
-X don’t use termcap init/deinit
-title[=TERM] set buffer name to terminal title string
-o opt=value assign value to config option
-show-option print all config options
-config file specify config file
-help print this usage message
-version print w3m version
-reqlog write request logfile
-debug DO NOT USE

Até Breve!

🙂

Linux find exemplo prático

semanickz

Linux find exemplos práticos


Para usar o terminal é bom saber um pouco sobre o que é o shell chamado bash. Computadores entendem a linguagem binária.

Nos primórdios da computação, as instruções eram fornecidas usando linguagem binária, o que é difícil para todos nós lermos e escrevermos. Portanto, em um sistema operacional, existe um programa especial chamado shell.

O shell aceita comandos legíveis por humanos e os converte em algo que o kernel pode ler e processar. Simplificando, o shell é um programa que recebe comandos do teclado e os fornece ao sistema operacional para executar. O shell é um programa do usuário ou é um ambiente fornecido para interação do usuário.

Antigamente, era a única interface de usuário disponível em um sistema semelhante ao Unix, como o Linux. Hoje em dia, temos interfaces gráficas com o usuário (GUIs), além de interfaces de linha de comando (CLIs), como o shell. O shell é iniciado quando você efetua login ou abre um console (terminal).

Na maioria dos sistemas Linux, um programa chamado bash (que significa Bourne Again SHell, uma versão aprimorada do programa shell original do Unix, sh, escrito por Steve Bourne) atua como o programa shell. Além do bash, existem outros programas shell que podem ser instalados em um sistema Linux. Estes incluem: ksh, tcsh e zsh.

No linux simplesmente gente usa o shell via um programa chamado terminal. O terminal é um programa que abre uma janela e permite interagir com o shell. Há vários emuladores de terminal diferentes que você pode usar. A maioria das distribuições Linux fornece vários, como: gnome-terminal, konsole, xterm, mate-terminal entre outros.

A gente inicia o terminal abrindo ele pelo menu do sistema. Este é o modo mais fácil. Embora o shell seja uma interface de linha de comando, o mouse ainda é útil. Além de usar o mouse para rolar o conteúdo da janela do terminal, você pode copiar o texto com o mouse. Arraste o mouse sobre algum texto (por exemplo, kdkjflajfks aqui na janela do navegador) enquanto mantém pressionado o botão esquerdo. O texto deve ser destacado. Solte o botão esquerdo e mova o ponteiro do mouse para a janela do terminal e pressione o botão do meio do mouse (alternadamente, você pode pressionar os botões esquerdo e direito ao mesmo tempo, se estiver trabalhando em um touch pad). O texto destacado na janela do navegador deve ser copiado na linha de comando.


O comando Linux Find é um dos comandos mais importantes e mais usados ​​nos sistemas Linux. Encontre o comando usado para pesquisar e localizar a lista de arquivos e diretórios com base nas condições especificadas para arquivos que correspondem aos argumentos. Localizar pode ser usado em várias condições, como você pode encontrar arquivos por permissões, usuários, grupos, tipo de arquivo, data, tamanho e outros critérios possíveis.


-Qual shell estou usando? Comando:

echo $0

-Encontrar arquivos usando o nome no diretório atual.

-Vou para minha home. comando:

cd ~/

-Vou para Documentos comando:

cd ~/Documentos/

-Crio um diretório em documentos:

mkdir test-find/

-Verifico onde estou:

pwd

-Listo por ordem de criação:

ls -t

-Navego para a pasta criada.

cd ~/Documentos/test-find/

-Crio alguns arquivos vazios:

touch my-arq.txt my-arq2.txt my-arq3.txt

touch my-arq_{a..d}.txt

-Listo os arquivos criados:

ls -lah


OBS: Os links . (este diretório) e .. são do sistema. Eles são mapas de nome-inode especiais que contam como hard-links (aumentam a contagem de links), embora não sejam realmente hard-links, os diretórios não podem ter hard-links. O ponto tem muitas funções no Bash do Linux. Assunto extenso para outro post.


Agora vou usar o comando find para buscar.

find *.txt


Exemplo:

:test-find$ find *.txt
my-arq2.txt
my-arq3.txt
my-arq_a.txt
my-arq_b.txt
my-arq_c.txt
my-arq_d.txt
my-arq.txt


find . *.txt

find . -name my-arq.txt

find my*.txt

find my-ar*.txt


Encontrar arquivos no diretório pessoal (Home)

cd ~/

find ~/ -name my-arq2.txt

find ~/ -name my-arq.txt

find ~/ -name my-arq*.txt

cd -

pwd

ls

ls -t

ls -lhi

echo 'Alô mundo! E fim! Posso remover tudo que criei com o mouse enviando para a lixeira ou excluindo.'


Para remover diretórios ou arquivos:

rm -ir nome-do-diretório

rm -i nome-do-arquivo

Então a gente pode criar uma pasta com o comando mkdir e um arquivo com o comando touch, mover o arquivo para dentro da pasta criada com o comando mv. Estamos no diretório anterior a pasta criada então podemos remover o diretório e o arquivo com o comando:

rm -ri nome-do-diretório


Interessante não é?


Até Breve!

🙂


O que mais pode tentar fazer? Encontrar arquivos usando nome e ignorando maiúsculas e minúsculas.


Encontrar diretórios usando o nome.


Encontrar arquivos PHP usando o nome. Vou pesquisar.


Alan Turing o homem que sabia demais

  • Turing era ingênuo, distraído e alheio às forças que o ameaçavam.

  • Considerado um risco para a segurança em virtude de seu heroico trabalho durante a Segunda Guerra Mundial (quebrando códigos) Turing foi preso e julgado.

  • Turing foi “expulso do mundo” pelas forças que viam nele um perigo,

  • Conseguiu viver neste mundo apenas 41 anos e no pouco tempo que esteve entre nós, Turing cravou seu nome para sempre na história da computação moderna, contribuindo para moldar o que conhecemos hoje como algoritmos e inteligência artificial.

  • Alan Mathison Turing filósofo e criptógrafo que nasceu em 23 de Junho de 1912 sucumbiu a imbecilidade humana.

  • Turing foi condenado a castração química 1952 por ser homossexual.

  • O matemático foi encontrado morto em sua casa, na cidade de Wilmslow, dois anos depois (7 de junho de 1954). A causa da morte foi envenenamento por cianeto. Ele mordeu uma maça mergulhada nessa substância que foi encontrada na mesa ao lado da cama (era um grande fã da animação Branca de Neve e os Sete Anões).

“A estupidez humana é uma das forças mais poderosas que moldam a história”.

-Yuval Noah Harari

  • A história sobre o processo de desvendar o Enigma é remontado na cinebiografia de Alan Turing, o “Jogo da Imitação (2015, Warner Bros), que tem Benedict Cumberbatch no papel principal.

Fonte