Linux bash shell script – Aprendendo declarações em if

As principais instruções condicionais do bash shell script são if e case.

Abra o emulador de terminal. Leia, copie e cole. Repita o processo.

1- NOME=Polodorio

2- echo $NOME

3- echo "$NOME"

4- echo "$NOME" && echo "$?"

5- echo "$NOME" && echo "$?" && echo "$$"

Se o diretório (-d) /tmp/ existir é sucesso, acerto é zero erro é 1 e o número do processo pode ser revelado usando echo “$$”

Copie e cole no terminal…

TMP=/tmp/; if test -d "$TMP"; then echo 'Sucesso'; fi; echo "$?"; echo "$$"

Se o arquivo (-f) aliases que deveria estar em : /usr/share/mime/aliases existir é sucesso, acerto é zero erro é 1 e o número do processo pode ser revelado usando echo “$$”. Se o arquivo não existir não haverá resposta nenhuma.

Copie e cole no terminal…

ARQ=/usr/share/mime/aliases; if test -f "$ARQ"; then echo "Sucesso."; fi; echo "$?"; echo "$$"

Linux bash shell script – Aprendendo declarações em if!

Se a variável for maior que dez então é sucesso!

Veja este pequeno bash shell script que preparei :

#!/bin/bash

NUM=12
if test "$NUM" -gt 10; then
	echo Sucesso
fi
Copie e cole no terminal...

NUM=12; if test "$NUM" -gt 10; then echo "Sucesso"; fi
Copie e cole no terminal...

NUM=12; if [ "$NUM" -gt 10 ]; then echo "Sucesso"; fi

A exclamação (!) é um caractere de negação. Execute no terminal :

(Se 12 não for maior que 10 sucesso)

Copie e cole no terminal...

NUM=12; if test ! "$NUM" -gt 10; then echo 'Sucesso'; fi

De novo…
(Se 12 não for maior que 10 sucesso)

Copie e cole no terminal...

NUM=12; if [ ! "$NUM" -gt 10 ]; then echo 'Sucesso'; fi
(Se 12 não for maior que 20 sucesso)

Copie e cole no terminal...

NUM=12; if test ! "$NUM" -gt 20; then echo 'Sucesso'; fi
(Se 12 não for maior que 20 sucesso)

Copie e cole no terminal...

NUM=12; if [ ! "$NUM" -gt 20 ]; then echo 'Sucesso'; fi

Usando if then else e fi :

(Se 12 não for maior que 20 sucesso ou então não é maior que 10)

Copie e cole no terminal...

NUM=12; if test ! "$NUM" -gt 10; then echo 'Sucesso'; else echo "Não é maior que 10"; fi

OBS :
Notou que não usou o fechamento de else que é elif?

Mais um bash shell script.

#!/bin/bash

NUM=12

if test ! "$NUM" -gt 10
then
	echo 'Sucesso'
else
	echo "Não é maior que 10"
fi

## fim do script

Veja só isto…

Se 12 for maior que 10 e se 12 também for menor que 15, então sucesso.

Usando test e -a :

Copie e cole no terminal...

NUM=12; if test "$NUM" -gt 10 -a "$NUM" -lt 15; then echo 'Sucesso'; fi

OBS: pode usar o -a várias vezes.
#!/bin/bash

NUM=12

if test "$NUM" -gt 10 -a "$NUM" -lt 15
then
	echo 'Sucesso'
fi

## fim do script
(se 12 for maior que 10 e se 12 também for menor que 15, então sucesso)

Copie e cole no terminal...

NUM=12; if [ "$NUM" -gt 10 -a "$NUM" -lt 15 ]; then echo 'Sucesso'; fi
#!/bin/bash

NUM=12

if [ "$NUM" -gt 10 -a "$NUM" -lt 15 ]; then
	echo 'Sucesso'
fi

## fim do script

Veja só este que usa ou (OR)…

Se 12 for maior que 10 ou se 12 também for menor que 15, então sucesso.


Usando test e -o :

Copie e cole no terminal...

NUM=12; if test "$NUM" -gt 10 -o "$NUM" -lt 15; then echo 'Sucesso'; fi

NUM=12; if [ "$NUM" -gt 10 -o "$NUM" -lt 15 ]; then echo 'Sucesso'; fi

OBS:
pode usar o -o várias vezes e pode misturar o -o com o -a
o -a tem preferêncoa sobre o -o

#!/bin/bash

# if_basico.sh
# declaração if básica

clear
DATA=2020
if [ $1 -gt 100 ]
then
    echo "Ei, $DATA este sim é um número grande."
	pwd
	date
	ls -FC | head
fi

echo "$?"
echo "$$"
echo "$@"

## fim do script

Em uma só linha. Copie e cole no terminal :

clear; DATA=2020; if [ "$DATA" -gt 100 ]; then echo "Ei, $DATA este sim é um número grande."; pwd; date; ls -FC | head; fi; echo "Acerto ou erro : $?"; echo "Processo : $$"; echo "$@"

Copie e cole no terminal :

echo "Digite lsblk para a variável linux: " ; read linux

Copie e cole no terminal :

echo “$linux”

$linux

Conclusão :

Neste post aprendemos o básico sobre como efetuar declarações em if no bash do GNU/Linux. Ao aprender sobre declaração if sabemos melhor as variáveis. Vamos sair (exit). Se sair ok o exit code será zero. Se sair errado, o exit code será diferente de zero.

Ficamos por aqui. Até breve.

$ wordpress -e exit

🙂

Um killswitch para o UFW

16-08-2020

Olá pessoal! Estamos aqui batendo cabeça com um killswitch que funciona e usa o firewall UFW.

O que é UFW? Bom …

Firewall descomplicado (UFW)

Um dos muitos aspectos anunciados do Linux é sua segurança.

Do desktop ao servidor, você encontrará todas as ferramentas de que precisa para manter essas máquinas bloqueadas da forma mais rígida possível.

Por muito tempo, a segurança do Linux esteve nas mãos do iptables (que funciona com o sistema netfilter subjacente). Embora incrivelmente poderoso, o iptables é complicado – especialmente para usuários mais novos. Para realmente tirar o máximo proveito desse sistema, pode levar semanas ou meses para ficar pronto.

Felizmente, um front end muito mais simples para iptables está pronto para ajudar a tornar seu sistema tão seguro quanto necessário.

Esse front-end é Uncomplicated Firewall (UFW). O UFW oferece uma estrutura muito mais amigável para gerenciar o netfilter e uma interface de linha de comando para trabalhar com o firewall.

Além disso, se você preferir não lidar com a linha de comando, o UFW tem algumas ferramentas de GUI que tornam o trabalho com o sistema incrivelmente simples.


Criamos um shell script que faz o kill switch existir. O código está logo abaixo :

Nome do bash shell script : ufw_killswitch.sh
#!/bin/bash

#############################################
## CONFIGURA UM UFW KILL SWITCH MANUAL PARA OPENVPN NO
## GNU/LINUX
## SCRIPT: ufw_killswitch.sh
## DATA: 16-08-2020
## OBS: ao reiniciar o sistema não precisa
## executar o script de novo.
## De vez em quando volto para
## as configurações originais do UFW
## para atualizar o relógio do sistema com
## o da rede (ntp) o sistema
## não funciona direito se o horário estiver
## incorreto.
## Para isto, uso outro script chamado: unfirewall.sh
#############################################
## voltando/iniciando as config normais/originais
## do ufw ... Quais? Estas : 
## default deny incoming
## allow outgoing
#############################################
## CONECÇÃO OPENVPN VIA NETWORK-MANAGER
#############################################
## OBS:
## O NETWORK-MANAGER É UM BEBÊ CHORÃO.
## O NETWORK-MANAGER É UMA MENININHA CHORONA.
#############################################

NORmconf(){
# faz o ufw voltar as configurações normais
	echo -e "\n\e[1;88;40m*** Unfirewall UFW ***\e[0m\n"
	sleep 8

	echo -e "\e[82msudo ufw reset & sudo ufw disabe\e[0m"
	sudo ufw disable
	sleep 1
	sudo ufw enable
	sleep 1
# --------------------------
	echo -e "\e[82msudo ufw --force reset\e[0m"
	sudo ufw --force reset
	sleep 1
# --------------------------
	echo -e "\e[82msudo ufw enable\e[0m"
	sudo ufw enable
	sleep 1
# --------------------------
	echo -e "\e[82msudo ufw status\e[0m"
	sudo ufw status
	sleep 8
# --------------------------
	echo -e "\e[82msudo ufw status verbose\e[0m"
	sudo ufw status verbose
	sleep 8
# --------------------------
	echo -e "\e[82msudo ufw default deny incoming\e[0m"
	sudo ufw default deny incoming
	sleep 2
# --------------------------
	echo -e "\e[82msudo ufw default allow outgoing\e[0m"
	sudo ufw default allow outgoing
	sleep 2
# --------------------------
	echo -e "\e[82msudo systemctl enable ufw\e[0m"
	sudo systemctl enable ufw
	sleep 2
# --------------------------
	echo -e "\e[82msudo ufw status verbose\e[0m"
	sleep 2
	sudo ufw status verbose
	sleep 8
# --------------------------
	echo -e "\e[82msudo ufw status numbered\e[0m"
	sleep 2
	sudo ufw status numbered
	echo ""
	sleep 2
}
NORmconf

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

read -p "*** Conecte a VPN e depois tecle enter aqui ***"

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

## PREPARAÇÃO PARA O KILLSWITCH 01
## PERMITIR SSH
## ACESSO A LAN NETWORK
sudo ufw allow in to 192.168.0.1/24
sudo ufw allow out to 192.168.0.1/24
# --------------------------
## PREPARAÇÃO PARA O KILLSWITCH 02
## permite a máquina se conectar a dispositivos
sudo ufw allow in on tun0 from any to any
# -------------------------
## PREPARAÇÃO PARA O KILLSWITCH 03
## PERMITIR OPENVPN
sudo ufw allow out 1198/udp
sudo ufw allow in 1198/udp
# --------------------------
## PREPARAÇÃO PARA O KILLSWITCH 04
## PARA NÃO TER QUE FICAR CONECTANDO E DESCONECTANDO
sudo ufw allow out from any to 192.168.0.1/24
# ---------------------------

## O KILLSWITCH ## O MOTIVO DE TUDO
sudo ufw default deny outgoing
sudo ufw default deny incoming
sudo ufw allow out on tun0 from any to any

# --------------------------
## KILLSWITCH É AQUI UM BASH SHELL SCRIPT QUE
## CONFIGURA REGRAS DO PROGRAMA UFW.
## O KILLSWITCH É UMA NEGAÇÃO DUPLA DO
## UFW FIREWALL QUE NÃO PERMITE DE 
## FORMA ALGUMA ENTRADA E SAÍDA DE NADA.
## SÓ PERMITE, SE FOR POR CONECÇÃO VPN UDP
## NO CASO DO LINUX ESTA É A OPÇÃO ESCOLHIDA
## POR HORA.
# --------------------------

## ADICIONANDO PORTAS OBTIDAS DE ARQUIVOS .OVPN
## DA EMPRESA QUE OFERECE OS SERVIÇOS DE VPN

# ----------------------------
sudo ufw allow out to 84.184.165.146 port 1194 proto udp

sudo ufw allow out to 84.120.218.64 port 1194 proto udp

sudo ufw allow out to 41.182.186.285 port 1194

sudo ufw allow out to 84.84.112.20 port 1194

sudo ufw allow out to 41.182.186.285 port 1194

sudo ufw allow out on eth0 to 144.124.142.48 port 1194  proto udp

sudo ufw allow out on eth0 to 84.184.165.146 port 1194  proto udp

sudo ufw allow out on eth0 to 148.284.148.188 port 1194  proto udp

sudo ufw allow out on eth0 to 84.184.165.146 port 1194  proto udp

sudo ufw allow out on eth0 to 84.14.58.66 port 1194  proto udp

sudo ufw allow out on eth0 to 144.124.142.48 port 1194  proto udp

## AVISO DE CONCLUSÃO
echo ""
read -p "*** O KillSwitch está ativado. Tecle Ctrl+C para sair ***"
echo ""

No momento é só isto. Usamos e parece ser útil. Para funcionar para você o script deve ser alterado em :

a) ACESSO A LAN NETWORK
b) 192.168.0.1
c) PORTAS OBTIDAS DE ARQUIVOS .OVPN

Até Breve!

🙂

Terminal verificar conecção com a rede

Verificar se está conectado a rede. Existem aplicativos e sites sem fim que ganham oferecendo este serviço. Existem até mesmo aplicativos, apps, apks e programas que cobram para fazer isto. Bom, nada é de graça, nem mesmo um serviço gratuito. Ah, os anos 20 são sempre assim? Tempos de pragas e todo tipo de vilanias que talvez sirvam de base um novo mundo no final do século. De novo isto? Novo mundo? Ops, expressão errada eu usei. O mundo está sempre mudando, mas certas coisas não mudam. Chega disto.

Olha o negócio é Linux bash shell script. Se a pessoa conseguir entender de verdade como este script funciona já pode saber que não é mais um bebê Linux. Já está adulto. Uma pessoa jovem adulta. Pode-se fazer centenas de scripts diferentes usando o que está neste shell script.

Nele encontramos: while, do, if, then , break, else, break, fi, done e uns comandos simples mas importantes.

Sem mais enrolação aí vai o código.

🙂

#!/usr/bin/env bash

#######################
## 05-08-2020
## conectados.sh
## semanickz
## https:://semanickz.wordpress.com
#######################

while :
do
  if ping -c 4 google.com &>/dev/null 2>&1
  	then
    	echo -e "\n\e[1;32mEstamos online!\e[0m\n"
    	break
else
	echo -e "\n\e[1;32mNão estamos conectados!\e[0m\n"
		break
  fi
  		sleep 4
done


# --- fim do script --- #

E é só isto. Ou melhor, é tudo isto! Um pequeno script que pode ser usado para realizar grandes coisas.

Até Breve!

🙂

Bash shell script tar.xz que compacta, descompacta, divide e junta arquivos

#!/usr/bin/env bash

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

# autor: semanickz
# email:
# test_comp_desc_split_join_tarxz.sh
# data 03-05-2020
# site: https://semanickz.wordpress.com

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

clear

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

echo -e "\n*** Abra o terminal onde está o arquivo a ser\
compactado. *** \n\nOBS: Para sair deste script tecle Ctrl+c"
sleep 2
echo ""

echo Local:
pwd
sleep 2
echo ""

echo -e "\n1- Confere os primeiros arquivos deste diretório... \n"
ls -t | head -15
sleep 2
echo ""

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

echo ""

echo -e "\nOfereço 4 opções (serviços) tar.xz.\
Escolha um número e tecle Enter.\n"
sleep 3

echo -e "\n: Para compactar tecle 1 \n: Descompactar tecle 2 \n: Para dividir\
um arquivo compactado grande em pedaços de 1GB tecle 3 \n: Para juntar um\
arquivo dividido tecle 4 \n: Para sair tecle Ctrl+c : \n"
read INPUT

case $INPUT in
1)
echo -e "\nCompactando tar.xz :\n"
sleep 2
echo -e "Você digitou: $INPUT, compactando...\n"
echo :Listando...
ls -t | head -20
read -p "Digite o titulo do arquivo tar.xz. Ex.\
meu_arquivo.tar.xz : " FILE
echo -e "\nVocê digitou: $FILE\n"
sleep 2
echo ""
read -p "Digite o nome completo (com espaços entre eles)\
do(s) arquiv(os)/past(as) a ser(em) compactados : " ARQUIVOS
echo -e "\nVocê digitou: $ARQUIVOS\n"
echo :Listando...
ls -t | head -15
sleep 2
echo ""
sleep 2
tar -cJf "$FILE" "$ARQUIVOS"
echo -e "\nFeito! \n"
echo Confere:
ls -t | head
;;
2)
echo -e "\nDescompactando tar.xz\n"
sleep 2
echo -e "Você digitou: $INPUT\n"
echo :Listando
ls -t | head
sleep 2
read -p "Digite o nome do arquivo tar.xz. : " FILE
echo -e "\nVocê digitou: $FILE\n"
echo :Listando...
ls -t | head -20
sleep 2
echo ""
sleep 2
echo "\nExecutando...\n"
sleep 2
tar -xf "$FILE"
echo -e "\nFeito! \n"
echo Confere:
ls -t | head
;;
3)
echo -e "\nDividindo arquivo tar.xz"
sleep 2
echo -e "\nVocê digitou $INPUT\n"
echo :Listando...
echo ""
ls -t | head
read -p "Digite o nome do arquivo tar.xz. : " FILE
echo -e "\nVocê digitou: $FILE\n"
sleep 2
split -b 1024m "$FILE" "$FILE".part
echo -e "\nFeito! \n"
echo Confere:
ls -t | head
;;
4)
echo -e "\nJuntando arquivos tar.xz\n"
sleep 2
echo -e "Você teclou : $INPUT; juntando...\n"
ls -t | head
read -p "Digite o nome do arquivo SEM a ext .part : " FILE
echo -e "\nVocê digitou: $FILE\n"
sleep 2
echo Local:
pwd
sleep 2
cat "$FILE".parta* >backup.tar.xz.completo
echo -e "\nFeito! \n"
echo Confere:
ls -t | head
;;
*)
echo "\nEu só sei 1, 2, 3 e 4. Tente novamente,\
ou tecle Ctrl+c para sair.\n"
esac

# --------------------------- 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!

---

Teste bash shell script telegram bot envia

#!/usr/bin/env bash

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

# test_telegram_bot_envia_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'

# URLMSG="https://api.telegram.org/bot$TOKEN4/sendMessage"

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

URL2="https://api.telegram.org/bot$TOKEN4/sendMessage"

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

clear

echo "*** Busque atualizações de bot e procure o id do bate-papo ***"

sleep 2

echo ""

read -p "Digite o Token de um bot : " TOKENUP

curl https://api.telegram.org/bot"$TOKENUP"/getUpdates

echo ""

echo "*** Colete informações... ***"

sleep 2

echo ""

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

read -p "*** Vamos ver os updates de outro bot? Tecle Enter ***"

read -p "Digite o TOKEN de outro bot : " TOKEN1

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

echo "Verificando..."

sleep 2

# curl "$URL_UP"

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

echo ""

echo "*** Colete informações... ***"

sleep 2

echo ""

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

echo "*** Enviar sticker ***"

sleep 2

echo ""

read -p "Digite o token : " TOKEN3

read -p "Digite o chat_id : " CHAT_ID

read -p "Digite o código do sticker : " STICKER

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

# --------------- ANOTAÇÕES:

# EXEMPLOS:

# para enviar stickers

# https://api.telegram.org/bot/sendSticker?chat_id=&sticker=BCBBADAgADOQADflsDlKEqOOd72VLKAg

# https://api.telegram.org/bot"$TOKEN3"/sendSticker?chat_id=&sticker="$STICKER"

# URL2='https://api.telegram.org/bot"$TOKEN3"/sendSticker?chat_id=&sticker="$STICKER"'

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

# para enviar arquivos

# curl "chat_id=$CHAT_ID&sticker=$STICKER" https://api.telegram.org/bot"$TOKEN3"/sendDocument

# curl https://api.telegram.org/bot"$TOKEN3"/sendSticker?chat_id="$CHAT_ID"&sticker="$STICKER"

# teste alterado para enviar stickers:

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

# teste - ou este...
curl -v -F "chat_id=$CHAT_ID&sticker=$STICKER" https://api.telegram.org/bot"$TOKEN3"/sendSticker

sleep 3

# teste - ou este...
curl https://api.telegram.org/bot"$TOKEN3"/sendSticker?chat_id="$CHAT_ID"&sticker="$STICKER"

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

echo "Confere..."

sleep 2

echo ""

curl https://api.telegram.org/bot"$TOKEN3"/getupdates

echo ""

echo "*** Telegram bot enviar mensagem ***"

echo ""

# URL2="https://api.telegram.org/bot$TOKEN4/sendMessage"

read -p "Digite o Token : " TOKEN4

read -p "Digite o chat_id : " CHAT_ID

read -p "Digite a mensagem : " MSG

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

echo ""

echo ":Confere..."

curl https://api.telegram.org/bot"$TOKEN4"/getupdates

# fim do script

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!

Bash script telegram bot enviar mensagens

Para obter o ID do bate-papo em grupo e enviar mensagens, faça o seguinte. Adicione o Telegram BOT ao grupo. Obtenha a lista de atualizações para o seu bot:

https://api.telegram.org/botTOKEN/getUpdates

Exemplo:

https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates e procure pelo "chat"

{"update_id":8393,"message":{"message_id":3,"from":{"id":7474,"first_name":"AAA"},"chat":{"id":,"title":""},"date":25497,"new_chat_participant":{"id":71,"first_name":"NAME","username":"YOUR_BOT_NAME"}}}

Esta é uma amostra da resposta quando você adiciona seu BOT a um grupo. Use o "id" do objeto "chat" para enviar suas mensagens.

---

#!/usr/bin/env bash

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

# Nome: test_script_telegram_bot_mensagem.sh
# Um script Bash simples que envia a mensagem
# "Hello World" através da API do Telegram.
# Pode enviar outras mensagens também
# Precisa do:
# 1) token:
#
# 2) chat_id:
# Para saber melhor veja os posts anteriores

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

# VARIÁVEIS:

TOKEN=TOKEN (SEQUENCIA DE NUMEROS E LETRAS)

CHAT_ID=-CHAT_ID (NUMEROS)

MESSAGE="Alô Mundo!"

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

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

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

echo -e "*** Vamos usar o bot para conversar no Telegram ***"

sleep 2

echo ""

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

read -p "Digite uma mensagem : " MSG

echo "Você digitou : $MSG"

echo ""

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

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

echo ""

echo "Feito!"

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

# ENVIAR PELO TERMINAL MENSAGEM A UM DETERMINADO CHAT ESPECÍFICO USANDO CURL:

# Precisa do:

# 1) token: SEQUENCIA DE NÚMEROS E LETRAS

# 2) chat_id: -NUMEROS

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

# Para descobrir CHAT_ID e outras coisas...

# https://api.telegram.org/botTOKEN/getupdates/

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

# Comandos:

# 1) curl -s -X POST https://api.telegram.org/bot/sendMessage -d chat_id=- -d text="Muito legal estar aqui pessoal!"

# 2) curl -s -X POST https://api.telegram.org/bot/sendMessage -d chat_id=- -d text="Muito legal! Vamos conversar aqui gente!"

# 3) curl -s -X POST https://api.telegram.org/bot/sendMessage -d chat_id=- -d text="Como é que faz para fazer pedidos aqui? Gostaria de pedir uns..."

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

# fim do script

Converter webm para mkv

#!/usr/bin/env bash

# Titulo: conv_lt_webm_to_mkv.sh
# Autor: claytu_dinamitti_1000%
# Versão: 0.0
# Email:
# Site:
# Data: 23-04-2020_11:10:14
# Distro: GNU/Linux
# Exemplo de uso:
# 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

# -------------------- # CONVERTENDO DE WEBM PARA MKV

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

# -------------------- # Ajusta título

for f in *.mkv; do
mkvpropedit "$f" -e info -s title="${f::-4}"
done

# -------------------- # sobrescrever metadata de mkv

for f in *.mkv; do
mkvpropedit "$f" --tags all: # remove a metadata?
done

echo -e "\n\e[1;33;40m*** Feito! ***\e[0m\n"

# fim do script

Bash script vídeo ou áudio

#!/usr/bin/env bash

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

# Titulo: test_video_ou_audio.sh
# Autor: claytu_tir_1000%
# Versão: 0.0
# Email:
# Site:
# Data: 23-04-2020_10:05:28
# Distro: GNU/Linux
# Exemplo de uso:
# Objetivo: usar ferramenta para obter arquivo de video ou de áudio
# Variaveis:
# TODO - indica uma tarefa a ser feita
# FIXME - indica um bug conhecido que precisa ser arrumado
# XXX - notícia, chama a atenção

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

clear # limpa a tela

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

echo -e "\e[1m*** Ferramenta para download com youtube-dl ***\e[0m"

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

read -p "Digite a URL : " URL # armazena URL

echo -e "Você digitou $URL" # imprime a URL

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

echo -e "\e[1m*** Baixar vídeo digite (1) ou áudio (2) ***\e[0m"
# oferece duas opções

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, baixando vídeo... "

firejail youtube-dl -cwi "$URL" # comando 1

break # sai após executar comando
;;

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

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

firejail youtube-dl --extract-audio --audio-format mp3 "$URL" # 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 -e "\n\e[1;33;40m*** E tá tudo resolvido! ***\e[0m\n" # mensagem final

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

# fim do script

Linux comando mv exemplos

Linux comando mv exemplos

---

O comando mv no Linux é usado para mover e renomear arquivos e diretórios. O mv é um dos comandos obrigatórios no Linux. mv significa movimento e é essencialmente usado para mover arquivos ou diretórios de um local para outro. A sintaxe é semelhante ao comando cp no Linux, porém há uma diferença fundamental entre esses dois comandos. Você pode pensar no comando cp como uma operação de copiar e colar. Enquanto o comando mv pode ser equiparado à operação de recortar e colar. O que significa que, quando você usa o comando mv em um arquivo ou diretório, o arquivo ou diretório é movido para um novo local e o arquivo/diretório de origem não existe mais. É uma operação de recortar e colar, não é?

1) comando cp = copiar e colar

2) comando mv = recortar e colar

---

O comando mv também pode ser usado para renomear um arquivo. O uso do comando mv é bastante simples e, se você aprender algumas opções, ele se tornará ainda melhor.

mv file1.txt file.2.txt file3.txt target_directory

---

Você também pode usar padrões regex para mover vários arquivos correspondentes a um padrão. Por exemplo, no exemplo acima, em vez de fornecer todos os arquivos individualmente, você também pode usar o padrão regex que corresponde a todos os arquivos com a extensão .txt e os move para o diretório de destino.

mv *.txt target_directory

---

Como renomear um arquivo - Um uso essencial do comando mv é renomear arquivos. Se você usar o comando mv e especificar um nome de arquivo no destino, o arquivo de origem será renomeado para o arquivo de destino.

mv source_file target_directory/target_file

---

No entanto, se o target_file já existir, ele será sobrescrito sem perguntar. O que significa que o conteúdo do arquivo de destino existente será alterado com o conteúdo do arquivo de origem. Você não é obrigado a fornecer um diretório de destino. Se você não especificar o diretório de destino, o arquivo será renomeado e mantido no mesmo diretório.

---

Lembre-se: Por padrão, o comando mv substitui se o arquivo de destino já existir. Esse comportamento pode ser alterado com a opção -n ou -i.

---

mv source_directory target_directory

---

No exemplo acima, se o diretório de destino existir, o diretório de origem inteiro será movido dentro do diretório de destino. O que significa que o source_directory se tornará um subdiretório do target_directory. Como renomear um diretório

---

Renomear um diretório é o mesmo que mover um diretório. A única diferença é que o diretório de destino ainda não deve existir. Caso contrário, o diretório inteiro será movido dentro dele, como vimos no diretório anterior.

mv source_directory path_to_non_existing_directory

---

Como lidar com a substituição de um arquivo enquanto se move? Se você estiver movendo um arquivo e já houver um arquivo com o mesmo nome, o conteúdo do arquivo existente será substituído imediatamente. Isso pode não ser o ideal em todas as situações. Você tem algumas opções para lidar com o cenário de substituição. Para evitar a substituição de arquivos existentes, você pode usar a opção -n. Dessa forma, o mv não substituirá o arquivo existente.

mv -n source_file target_directory

---

Você também pode usar a opção de atualização -u ao lidar com a substituição. Com a opção -u, os arquivos de origem serão movidos para o novo local apenas se o arquivo de origem for mais novo que o arquivo existente ou se ele não existir no diretório de destino.

---

Para resumir:

-i: Confirme antes de substituir
-n: Sem substituição
-b: Substituindo pelo backup
-u: Substitua se o arquivo de destino for antigo ou não existir.

---

Mas talvez você queira substituir alguns arquivos. Você pode usar a opção interativa -i e ela perguntará se você deseja substituir os arquivos existentes.

mv -i source_file target_directory
mv: overwrite 'target_directory/source_file'?

---

Você pode digitar y para substituir o arquivo existente ou n para não substituí-lo. Há também uma opção para fazer backups automáticos. Se você usar a opção -b com o comando mv, ele substituirá os arquivos existentes, mas antes disso, criará um backup dos arquivos substituídos.

---

mv -b file.txt target_dir/file.txt
ls target_dir
file.txt file.txt~

---

Por padrão, o backup do arquivo termina com ~. Você pode alterá-lo usando a opção -S e especificando o sufixo:

mv -S .back -b file.txt target_dir/file.txt
ls target_dir
file.txt file.txt.back

---

Você também pode usar a opção de atualização -u ao lidar com a substituição. Com a opção -u, os arquivos de origem serão movidos para o novo local apenas se o arquivo de origem for mais novo que o arquivo existente ou se ele não existir no diretório de destino.

Para resumir:

-i: Confirme antes de substituir
-n: Sem substituição.
-b: Substituindo pelo backup
-u: Substitua se o arquivo de destino for antigo ou não existir.

Como mover com força os arquivos. Se o arquivo de destino estiver protegido contra gravação, você será solicitado a confirmar antes de substituir o arquivo de destino. Para evitar esse prompt e substituir o arquivo imediatamente, você pode usar a opção force -f.

mv -f file1.txt target

---

Anotação rmvb para mp4

Testando um script bash para converter rmvb para mp4.

#!/usr/bin/env bash

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

# Titulo: conv_lt_rmvb_2_mp4.sh
# Autor: arceu_valenti_1000%
# Versão: 0.0
# Email:
# Site:
# Data: 15-04-2020_09:35:04
# Distro: GNU/Linux
# Exemplo de uso:
# 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

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

function rmvb2mp4(){

clear

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

# SOBREESCREVE METADATA 1

#echo "*** SOBREESCREVE METADATA 1 ***"

#for i in *.rmvb; do
# exiftool "$i" --tags all: # Não
#done

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

# AJUSTA TITULO 1

echo "*** AJUSTA TITULO 1 ***"

for f in *.rmvb; do
ffmpeg -i "$f" -e info -s title="${f::-4}"
sleep 2
done

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

# CONVERTE DE RMVB PARA MP4 SOBRESCREVE METADATA

echo "*** CONVERTE DE RMVB PARA MP4 SOBRESCREVE METADATA ***"

# for f in *.rmvb; do ffmpeg -i "$f" -map_metadata -1 -c:v copy -c:a copy -map 0 "${f%.*}.mp4"; done # NAO

# for f in *.rmvb; do ffmpeg -i "$f" -c:a copy "${f%.*}.mp4"; done # NAO

# Loop for simplificado:

# for %%G in (*.rmvb) do ffmpeg -i "%%~G" -c:v h264 -c:a aac "%%~nG.mp4" # SIM

# Este converte h264 video e aac audio. Estes codecs parecem ser
# bem comuns hoje em dia.

# O padrão do vídeo é CRF 23, enquanto o áudio deve ter 128k.
# Isso deve oferecer qualidade razoável em talvez um décimo da taxa de bits
# mostrado na imagem de 9300k, talvez abaixo de 1000k.

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

for f in *.rmvb; do
ffmpeg -i "$f" -c:v h264 -c:a aac "${f%.*}.mp4"
done

# TRABALHO PESADO ESTA CONVERSÃO
# Oneliner?

# for f in *.rmvb; do ffmpeg -i "$f" -c:v h264 -c:a aac "${f%.*}.mp4"; done

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

#for f in *.rmvb; do
# ffmpeg -i "$f" -map_metadata -1 -c:v copy -c:a copy "${f%.*}.mp4"
# sleep 3
# ls -ltF | head
#done

# ONELINER?

# for f in *.rmvb; do ffmpeg -i "$f" -map_metadata -1 -c:v copy -c:a copy "${f%.}.mp4"; sleep 3; ls -ltF | head; done

# for f in *.rmvb; do ffmpeg -i "$f" -c:a copy "${f%.}.mp4"

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

# QUEBRA DE LINHA

# for f in *.rmvb; do ffmpeg -i "$f" \
# -map_metadata -1 -c:v copy \
# -c:a copy "${f%.}.mp4"; \
# sleep 3; ls -ltF | head; \
# done

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

# DELETA RMVB

for file in *.mp4; do
ls -lt | head
read -p "Sair: Ctrl+c. Deletar rmvb? Para isto, tecle Enter : "
rm -f "$file"
done

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

# SOBREESCREVE METADATA 2

echo "*** SOBREESCREVE METADATA 2 ***"

for i in *.mp4; do
exiftool "$i" --tags all:
done

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

# AJUSTA TITULO 2

echo "*** AJUSTA TITULO 2 ***"

for f in *.mp4; do
ffmpeg -i "$f" -e info -s title="${f::-4}"
sleep 2
done

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

# EXIBE METADATA

echo "*** EXIBE METADATA ***"

for f in *.mp4; do
exiftool "$f"
done

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

echo "Feito!"

}

rmvb2mp4

# NOTAS:
# ffmpeg -i input.mp4 -map_metadata -1 -c:v copy -c:a copy output.mp4

# fim do script

Loop for exemplo prático

Loop for exemplo mp3 para wav

Um exemplo prático - para loops, faça mais do que repetir listas de números.

Por exemplo, use a saída de outros comandos como a lista. O exemplo a seguir mostra como converter arquivos de áudio de MP3 para WAV:

---

#!/usr/bin/env bash

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

# nome: lt_conv_mp3_2_wav.sh
# objetivo converter mp3 para wav

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

function mp32wav () {

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

clear

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

# sobrescreve metadata loop

for i in *.mp3; do
exiftool -all= -overwrite_original -ext "$i" .
done

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

# melhora ganho de audio mp3 loop

for i in *.mp3; do
mp3gain -c -r "$i"
done

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

# CONVERTE PARA WAV loop

for i in *.mp3; do
ffmpeg -i "$i" "${i/%mp3/wav}"
done

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

# sobrescreve metadata

for i in *.wav; do
exiftool -all= -overwrite_original -ext "$i" .
done

}

mp32wav

# fim do script

---

A lista neste exemplo é todo arquivo com a extensão .MP3 na pasta atual e a variável é um arquivo. O comando converte o arquivo MP3 em WAV. No entanto, você provavelmente precisará instalar esta ferramenta usando um gerenciador de pacotes primeiro.

Zipar uma pasta usando linha de comando no Linux

Zip uma pasta na linha de comando do Linux

---

A sintaxe para usar o comando zip é bastante direta.

zip [option] arquivo_zip_a_criar.zip entrada1 entrada2

---

Embora possa haver várias opções, aqui o básico para não ter confusão.

Se o único objetivo é criar uma pasta zip a partir de vários arquivos e diretórios, use um comando como este.

zip -r nome_do_folder.zip arquivo1 diretorio1

---

A opção -r será recursiva em diretórios e compactará seu conteúdo também. A extensão .zip nos arquivos de saída é opcional, pois .zip é adicionado por padrão.

Você pode ver os arquivos sendo adicionados à pasta compactada durante a operação zip.

---

Você pode usar a opção -e para criar uma pasta zip protegida por senha no Linux.

---

Você nem sempre está restrito ao terminal para criar arquivos compactados. Você pode fazer isso graficamente também com um gerenciador de compactação. Instale-o pelo software center do seu sistema operacional GNU/Linux.

---

Sintaxe:

zip [option] arquivo_zip_a_criar.zip entrada1 entrada2

---

Comando:

zip -r zipado_pacote.zip meu_arquivo1 meu_diretorio1

---

Onde:

ARQUIVO ZIP A SER CRIADO: zipado_pacote.zip

ARQUIVOS QUE IRÃO SER ZIPADOS: meu_arquivo1 meu_diretorio1

---

Um script para zipar ~/bin:

#!/usr/bin/env bash

# Titulo: test_zip_bin.txt.sh
# Autor: claytu_dinamitti_1000%
# Versão:
# Email:
# Site:
# Data:
# Distro:
# Exemplo de uso:
# Objetivo:
# Variaveis:
DDT=`date +%d-%m-%Y`
# TODO - indica uma tarefa a ser feita
# FIXME - indica um bug conhecido que precisa ser arrumado
# XXX - notícia, chama a atenção

# zip [option] nome_arq_zipado entrada1 entrada2

function zipbin () {

zip -r zip_bin_$DDT.zip ~/bin

}

zipbin

# fim do script

---

Teste converter mkv para avi

#!/usr/bin/env bash

# Titulo: test_conv_mkv_2_avi.sh
# Autor: claytu_dinamitti_1000%
# Versão: 0.0 Forever!
# Email:
# Site:
# Data: 11-04-2020_10:13:54
# Distro:
# Exemplo de uso: ./test_conv_mkv_2_avi.sh
# Objetivo: Aprendizado
# Variaveis: VANUTIL=’variavel_util_aqui’
# TODO – Não sei o que lá…
# FIXME – Tudo – Ajustar o título original do arquivo avi…
# XXX – Não teste em originais. Teste em cópias primeiro.

# ————————————————————– #

# 1 – Sobreescrever metadata de mkv

# Usar: mkvpropedit *.mkv –tags all:

echo ‘Comando 1 – Sobrescrever metadata…’
sleep 3

for i in *.mkv; do
mkvpropedit “$i” –tags all:
done

# ————————————————————– #

# Ajustar o título original do arquivo

echo ‘2 – Ajustar o título original do arquivo mkv…’
sleep 3

for i in *.mkv; do
mkvpropedit “$i” -e info -s title=”${i::-4}”
done

# ————————————————————– #

# 2 – Converter de mkv para mp4 e de mp4 para avi

echo ‘Comando 3 – Converter de mkv para mp4 e de mp4 para avi…’

# inspirado em:
# ffmpeg -i input.mkv -codec copy output.mp4
# Converter mkv para mp4

for f in *.mkv; do
ffmpeg -i “$f” -codec copy “$(basename “${f/.mkv}”).mp4″
sleep 4
done

# ————————————————————– #

for f in *.mp4; do
ffmpeg -i “$f” -codec copy “$(basename “${f/.mp4}”).avi”
sleep 4
done

# ————————————————————– #

echo ‘Feito!’
sleep 3

# ————————————————————– #

echo ‘4 – Listando os dez primeiros arquivos: ‘

# Uma função para algo tão simples…
# Kkkkk…
# Estou aprendendo a usar estes troços.
# Fazer o quê?

function listar () {
ls -t | head
sleep 4
}

listar

# Oneliner?
# function listar () { ls -tLC | head; sleep 4; }; listar

# ————————————————————– #

echo ‘5 – Removendo TODOS os arquivos mkv e mp4 em 8 segundos a menos que tecle Ctrl+c para interromper…’

sleep 8

function removemkvmp4 () {
rm -rf *.mkv
rm -rf *.mp4
}

removemkvmp4

# ————————————————————– #

echo ‘6 – Confere agora os dez primeiros arquivos: ‘

ls -t | head

sleep 4

# ————————————————————– #

echo ‘7 – Ajustar o título original do arquivo avi…’
sleep 3

# Testando não sei o que fazer…
# Devia testar individualmente…
# Um destes funciona.

for f in *.avi; do
mkvpropedit “$f” -e info -s title=”${f::-4}” # usado em mkv.
ffmpeg -i “$f” -e info -s title=”${f::-4}” # acho que não vai…
exiftool “$f” -e info -s title=”${f::-4}” # talvez em mp4. avi veremos…
done

# ————————————————————– #

echo ‘Listando…’

sleep 3

ls -tCF | head

sleep 4

# ————————————————————– #

echo ‘8 – Exibindo metadata dos arquivos avi deste diretório: ‘

sleep 2

pwd

sleep 4

# Usando função

function avimetadata () {
exiftool *.avi
}

avimetadata

# ————————————————————– #

# fim do script

Linux script converter em lote png para jpg

#!/usr/bin/env bash

# titulo: script_png2jpg.sh
# autor: claytu_dinamitti_1000%
# data:
# uso:

# Comandos:
# jpegoptim *.JPG
# jpegoptim *.jpg
# optipng *.JPG

# ——————————————- #

echo ‘Comando 1’

for png in *.png; do
optipng “$png”
done

# ——————————————- #

echo ‘Comando 2’

ls -1 *.png | xargs -n 1 bash -c ‘convert “$0” “${0%.png}.jpg”‘

# ——————————————- #

# OBS: Converter PNG em JPG (vice-versa) usando os comandos ls e xargs. O comando ls permite listar todas as suas imagens png e o xargs possibilita criar e executar um comando de conversão da entrada padrão para converter todas as imagens .png em .jpg. – Explicação sobre as opções usadas no comando acima. -1 O sinalizador diz ao ls para listar uma imagem por linha. -n Especifica o número máximo de argumentos, que é 1 para o caso. -c Instrui o bash para executar o comando fornecido. ${0% .png} .jpg Define o nome da nova imagem convertida, o sinal% ajuda a remover a extensão de arquivo antiga. – Usei o comando ls -ltr para listar todos os arquivos por data e hora modificadas.’

# ——————————————- #

echo ‘Comando 3’

for jpg in *.jpg; do
jpegoptim “$jpg”
done

# ——————————————- #

# optipng *.PNG
# optipng *.png

# ——————————————- #

echo ‘Comando 4’

jpegoptim *.jpg

optipng *.png

# ——————————————- #

echo ‘Tudo feito!’

# fim do script

Linux script funções aninhadas

Linux shell script funções 11042020

Funções aninhadas. Uma das características mais interessantes das funções é que elas podem se chamar e também outras funções. Uma função que se chama é conhecida como função recursiva. O exemplo a seguir demonstra o aninhamento de duas funções:

#!/usr/bin/env bash

# Nome: chama_funcao_de_outra.sh

# Chamando uma função de outra.

clear

numero_um () {
echo “Esta é a primeira função falando …”
numero_dois
}

numero_dois () {
echo “Esta é a segunda função falando …”
}

# Chamando a função um.

numero_um

# fim do script

Para treinar seria legal tentar escrever pelo menos um shell script teste por dia. Nestes shell scripts haveriam funções e loops por exemplo. Na falta de idéias vale tentar escrever um script antigo de uma maneira diferente.

Tentar colocar funções em shell scripts. Dentro de uma função um loop? Uma função que converte jpg para png:

#!/usr/bin/env bash

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

# Nome: funcao_conv_jpg_2_png.sh
# OBS:
# Sempre efetue um backup de todas as suas imagens antes de utilizar qualquer
# programa de otimização, pois, caso algo ocorra inesperadamente você tem a
# possibilidade de reverter rapidamente os arquivos para os arquivos originais.
# Pode ser que os utilitários alterem as permissões do arquivos, certifique-se
# sempre que a imagem está disponível no navegador.
# Para funcionar este shell script precisa dos programas exiftool,
# jpegoptim, optipng

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

# —————————————- #

# primeiro sobreescrever metadata

read -p “Sobreescrever metadata de jpg? Tecle Enter para continuar ou Ctrl+c para sair: ”

echo ‘Função 1 sobreescrever:’

function sobreescrever () {

exiftool -all= -overwrite_original -ext jpg .
sleep 4

}

sobreescrever

echo ‘*** Função 1 executada ***’

# —————————————- #

read -p “Otimizar jpg? Tecle Enter para continuar ou Ctrl+c para sair: ”

echo ‘Função 2 otimizar jpg:’

function otimizar () {

jpegoptim *.jpg

jpegoptim *.JPG

optipng *.JPG

sleep 4

}

otimizar

echo ‘*** Função 2 executada ***’

# —————————————- #

read -p “Converter jpg para png? Tecle Enter para continuar: ”

echo ‘Função 3 converter jpg para png’

# OBS: dentro da função 3 é executado um loop for

function converter () {

for image in *.jpg; do convert “$image” “${image%.jpg}.png”; done

sleep 3

}

converter

echo ‘*** Função 3 executada ***’

# —————————————- #

read -p “Sobreescrever metadata e otimizar png? Tecle Enter para continuar: ”

echo ‘Função 4 sobreescrever metadata de png’

function metapng () {

exiftool -all= -overwrite_original -ext png .
sleep 3
optipng *.png
optipng *.PNG
sleep 3

}

metapng

echo ‘*** Função 4 executada ***’

# —————————————- #

read -p “Listar 10 arquivos do diretório que foram alterados? Tecle Enter para continuar: ”

echo ‘Função 5 listar os 10 primeiros’

function listahead () {

ls -t | head

}

listahead

echo ‘*** Função 5 executada ***’

echo ‘Feito!’

# fim do script

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.