Comandos principais do shell script
cd ..oucd ../../Downloads: subir de nivelcd -: volta para o anteriorcdoucd ~: vai para home
ls -ltr: ordena do mais velho para o mais novols -l: lista arquivos com permissõesls -1: lista sem detalhes
ps axu: lista de processos detalhados- pcaxu|more` : lista com cabeçalho
echo -n "text": não quebra linha- `echo -e "text\ttext2\n" : inclui comando especiais
mkdir diretorio1: cria um diretóriomkdir -p diretorio1/exercicio1: cria um diretório e um sub-diretório
rm arquivo: remove arquivorm -r diretorio: remove diretório com sub-diretórios e arquivosrm -f arquivo: remove o arquivo sem retornar messagens de alerta
sleep 5: espera 5 segundos
cat arquivo: mostra conteúdo do arquivocat -b arquivo: mostra com somente as linhas com texto enumeradascat -n arquico: mostra com todas as linhas enumeradas inclusive as brancascat -A arquivo: mostra incluindo os caracteres especiais
tac arquivo: mostra todo o conteúdo do arquivo de trás para frente
tail -n2 arquivo: mostra somente as 2 últimas linhastail -f arquivo: monitora por mudanças as últimas 10 linhas do arquivo até que seja interrompido (follow)
head -n2 arquivo: mostra somente as 2 primeiras linhashead -c10 arquivo: mostra os 10 primeiros caracteres
wc arquivo: mostra as linhas, palabras e caractereswc -l arquivo: mostra o número de linhaswc -w arquivo: mostra o número de palavraswc -m arquivo: mostra o número de caractereswc -c arquivo: mostra o número de byteswc alunos*: executa o comando para todos os arquivos que começam com alunostail -n5 arquivos|wc -w: usa a saído do tail e envia ela para o wc para contar as plavras
sort arquivo: ordena um arquivosort -r arquivo: ordena um arquivo de forma decrescentesort -k2 arquivo: altera o índice de ordenação para o segundotail /etc/passwd| sort -k3 -t":": altera o delimitador para:e ordena pelo 3 campotail /etc/passwd| sort -k3 -t":" -g: altera o delimitador para:e ordena pelo 3 campo considerando numérico
uniq arquivo- mostra somente a primeira ocorrência da palavra na sequência, não considera repetidos que não estão na sequênciasort arquivo| uniq- mostra somente uma única vez as ocorrências após ordenarsort arquivo| uniq -u- mostra somente as ocorrências únicassort arquivo| uniq -d- mostra somente as ocorrências duplicadassort arquivo| uniq -c- conta as repetiçõessort arquivo| uniq -c| sort- conta as repetições e as ordena da menor para maiorsort arquivo| uniq -c| sort -r- conta as repetições e as ordena da maior para menorsort arquivo| uniq -c| sort -r | head -n1- mostra somente a ocorência que aconteceu mais
whatis tr: mostra a função do tr
whereis date: mostra onde está o date em disco
cat arquivo| tr a e: troca toda ocorência deaporecat arquivo| tr a-z A-Z: troca toda letra minúscula por maiúsculacat arquivo| tr aei AEI: trocaaeiporAEIcat arquivo| tr ' ' '\t': troca espaço por tabcat arquivo| tr -d aei: remove as letrasaeiecho "Curso Shell Script"| tr -s 'l': comprime olpara aparecer somente uma vezecho "curso de shell script"| tr [:lower:] [:upper:]: converte as letras minúsculas para maiúculas
cat arquivo| cut -c1-5: mostra somente dos caracters de 1 a 5 de cada linha do arquivocat arquivo| cut -c1,2,5: mostra somente os caracters 1, 2 e 5 de cada linhacat arquivo| cut -c5-: a partir do caractere 5cat arquivo| cut -c-5: até o caractere 5cat arquivo| cut -c1,2,10-: caractere 1, 2 e a partir do 10cat arquivo| cut -d" " -f1: mostra somente o primeiro campo onde a delimitação é espaçocat arquivo| cut -d" " -f1,3: mostra somente o primeiro e o terceiro compo com delimitação de espaço
diff arquivo1 arquivo2: mostra a diferença entre os arquivosdiff arquivo1 arquivo2| cat -A: mostra a diferença incluindo os caracteres especiaisdiff -w arquivo1 arquivo2: mostra a diferença desconsiderando os espaços em brancodiff -r dir1 dir2: mostra a diferença entre diretórios
grep NOME arquivo: procura pelo NOME no arquivogrep NOME arquivo*: procura pelo NOME em todos os arquivos que começam com arquivo*grep "NOME COMPLETO" arquivo: procura pela string entre aspasgrep -i NOME arquivo: procura pelo NOME desconsiderando maiúsculas e minúsculasgrep -c NOME arquivo: conta quantas vezes encontrou NOMEgrep -v NOME arquivo: não mostra a linha onde aparece o NOME, somente outras linhasgrep -r NOME *: procura por NOME dentro de todos os arquivos dentro de todos os subdiretórios relativos ao caminho atualgrep -rl NOME *: procura por NOME dentro de todos os arquivos e mostra somente o caminho do arquivocat arquivo| grep NOME: procura por nome no arquivogrep -A3 NOME arquivo: procura por NOME e mostra 3 linhas após a ocorrência do NOMEgrep -B3 NOME arquivo: procura por NOME e mostra 3 linhas antes da ocorrência do NOMEfgrep: não aceita expressões regularesegrep: aceita expressões regulares extendidas
sed '1,3 d' arquivo: não mostra as linhas 1 e 3sed '/Rafael/d' arquivo: não mostra as linhas onde aparece Rafaelcat arquivo| sed 's/Paulo/Joao/': substitui Paulo por Joao na primeira ocorrênciaecho 'Curso Linux Shell Script Linux'| sed 's/Linux/Unix/g: substitui todas as ocorrências de Linux por Unix
more arquivo: mostra o conteúdo de maneira paginada
less arquivo: para pesquisa, /, n para navegar e ? para procura de baixo para cimacat -A arquivo| less: pega o conteúdo do arquivo e pagina com lesscat -A arquivo| grep a| less: mostra toda linha onde aparece a letra a de forma paginada
find ./ -name alunos: procura por um arquivo com o nome alunosfind ./ -name *copia*: procura por que contenha no nome copiafind ./ -user ricardo -name alunos- procura por arquivo chamado alunos do usuário ricardofind ./ -name alunos* -exec ls -l {} \;- aplica o comando ls -a para cada resultado da busca
date +%d/m: mostra somente a data com dia e mês
seq 20: inicia do 1 ao 20seq 5 12: inicia em 5 e termina em 12seq 0 5 30: inicia em 0 e vai até o 30 de 5 em 5
expr 5 + 2: faz 5 + 2expr 5 \* 2: faz 5 * 2
echo "(3 + 2) * 5"| bc: resolve a expressão dentro do echobc <<< "scale=2; 100/3": resolve a expressão dentro das aspas e retorna 33.33 (https://stackoverflow.com/questions/12722095/how-do-i-use-floating-point-division-in-bash/28541396)
stat alunos.txt: mostra informações para o arquivo alunos.txt
cat alunos.txt| wc -l: conta o número de linhas do arquivo alunos.txt
date ; echo linux ; ls: executa em sequência os comandos
ls alunos.txt && echo linux: somente executa o segundo se o primeiro terminar com sucesso
ls alunos.txt || echo linux: somente executa o segundo se o primeiro falhar
(cd .. ; ls -l): executa o ls na pasta anterior se mudar o caminho atual
cat alunos.txt > alunos-temp.txt: cria ou sobre-escreve a saída do cat no arquivo alunos-temp.txt
date >> aluons-temp.txt: concatena ao final do arquivo alunos-temp.txt
ls -l alunos.txt2 2> log.out: redireciona a saída de erro para um arquivo
ls -l alunos.txt2 2>> log.out: contatena ao final do arquivo a saída de erro
ls -l alunos.txt > log.out 2> log-erro.out: caso dê certo, coloca a saída em log.out, caso dê erro, coloca a saída em log-erro.outls -l alunos.txt > log.out 2> &1: coloca as duas saídas no mesmo arquivols -l alunos.txt >> log.out 2> &1: coloca as duas saídas no mesmo arquivo concatenando com o conteúdo existente
ls -l alunos.txt 2> /dev/null: caso dê erro, não mostra e não salva em lugar nenhum
tr 'a' 'Z' < alunos.txt: rediciona o conteúdo do arquivo alunos.txt para o comando tr
env
set
VARIAVEL1=valor: cria uma variávelCURSO="curso de shell script": conteúdo com caracteres especiais
echo $VARIAVEL1: mostra a variável na saída
$$: PID do shell atual$0ou$SHELL: mostra o tipo do shell que está sendo executado
echo $$ # mostra o PID do bash atual
TESTE=Curso # cria a variável
export TESTE # exporta a variável para outros sub-processos
bash # cria uma nova sessão do bash
echo $$ # confirma q está em outro bash
echo $TESTE # mostra q tem acesso a variável TESTE
exit # sai do sub bash
export VAR1=teste # exporta e cria a variável
HORA=date +%H`` : atribui o valor do comando à variávelMINUTO=$(date +%M): atribui o valor do comando à variável
echo "var $VAR" : mostra o conteúdo das variável concatena com a string
echo 'var $VAR' : não mostra o conteúdo da variável
echo cuso shell: o shell suprime os espaçosecho curo\ \ \ shell: o shell adiciona espaçosecho \*: mostra o *echo *: mostra todos os itens do diretório atual
:1: primeira linha:$: última linha:!ls /tmp: executa o ls e depois retorna ao VI/Linux: procura Linux no arquivo de cima para baixo, navega comn?Linux: procura Linux de baixo para cimadd: recorta uma linhad4d: recorta 4 linhasp: cola a linhayy: copia uma linhay5y: copia 5 linhasw: salva o arquivowq: sai e salvaq!: força a saída0: vai para o início da linha$: vai para o final da linha
ls -l AULA*: aplica ls -l para qualquer arquivo que possui um nome que inicia com AULA
ls -l AULA[123]: somente retorna os nomes que iniciam com AULA1, AULA2 e AULA3ls -l Aul[Aa][1-3]: somente aquivos com Aula* ou AulA* que terminam com 1, 2 ou 3
ls -l {Aula,AULA}3: procura por Aula3 e por AULA3
ls -l Aula?: procura por Aula seguido de somente um caracterels -l Aula??: procura por Aula seguido de 2 caracteres
egrep "b[aei]g" texto.txt: probura por bag, beg e big
egrep "ˆLinux" texto.txt: toda linha que comece com Linux
egrep "Linux$" texto.txt: toda linha que termine com Linuxegrep "ˆ$" texto.txt: mostra todas as linhas em brancoegrep -v "ˆ$" texto.txt: não mostra as linhas em branco
egrep "b[a-i]g*" texto.txt: a letra g pode aparecer nenhumo, uma ou várias vezes
egrep "b[a-i]g+" texto.txt: a letra g deve aparecer uma ou mais vezes
egrep "b[a-i]g?" texto.txt: a letra g pode aparecer nenuma ou apenas uma vez
egrep "O.Linux" texto.txt: procura por frases com qualquer caractere entre O e Linuxegrep "O.*Linux" texto.txt: procura por frases que tenha O seguido de qualquer coisa e Linux, considera também OLinux
egrep "[Ll]inux\." texto.txt: interpreta o . como um caractere e não como parte da expressão: linux.com seria selecionado
#!/bin/bash: especifica para utilizar o bash como interpretador do script atual
chmod +x script.sh: adiciona permissão de execução para todos os usuárioschmod 744: adiciona permissão de execução para o usuário atual e somente leitura para os outros
./script.sh: abre um shell filho do atual, executa o script e retorna o resultadosource script.shou. script.sh: executa o script na sessão atual do shellbash script.sh: executa o script com um interpretador específico./script.sh &: executa o script em modo deamon, ou seja, em background
PATH="$PATH:/home/usuario/Cursos/ShellScript/Scripts": adiciona ao PATH o meu diretório de scripts~/.profile: arquivo responsável por configurar a variável $PATH ao inicial a sessão do usuário
- 0 a 255 : 0 é sucesso, qualquer outra coisa é não sucesso
$?: variável que armazena o código de saída(retorno) do último comandoecho $?: mostra o valor que está na variávelRETURN_CODE=$?: armazena o valor do código de erro em uma variável
exit 10: sai do script com o código 10exit: sai do comando com o código 0
read NOME: o valor de entrada e armazena em NOME
read VAR1 VAR2 VAR3: se digitar "cuso shell script" cada parte separada por espaço e armazena em uma variável diferente
read -p "Informe o seu curso: " CURSO: mostra o usuário o texto, recebe a entrada e armazena em CURSO
read -s CODIGO: armazena que o usuário digita mas não mostra no terminal
$0: Nome do programa$#: Quantidade de parâmetros$*: Todos os parâmetros inseridos$1-9: Cada um dos parâmetros
if <comando>
then
comando1
comando2
comando3
fi
if <comando>
then
comando1
else
comando2
fi
if <comando>
then
comando1
elif <comando>
then
comando2
else
comando3
fi
test <expressão>: testa a expressão e retorna 0 para sucesso ou outra coisa para errotest 50 -qt 100: se 50 é maior que 100[ 50 -gt 100]: omite a palavra teste e usa []- exemplo com if:
VAR1=12
if test "$VAR1" -gt 10
then
echo sucesso
fi
if ["$VAR1"-gt 10]
then
echo sucsso
fi
VAR=12
if [! "$VAR1" -gt 10]
then
# não entra nessa condição
echo sucesso
fi
VAR=12
if ["$VAR1" -gt 10 -a "$VAR1" -lt 20] # AND
then
echo sucesso
fi
VAR=12
if ["$VAR1" -gt 10 -o "$VAR1" -eq 5] # OR
then
echo sucesso
fi
case $valor in
padrão1)
comandos
;;
padrão2)
comandos
;;
*)
comandos
;;
esac
case $opcao in
1)
echo "opção incluir"
;;
2)
echo "opção remover"
;;
*)
echo "opção inexistente"
;;
esac
case $caracter in
[0-9])
echo "o caractere informado é um número"
;;
[A-Z])
echo "o caractere informado é uma letra maiúscula"
;;
[a-z])
echo "o caractere informado é uma letra minúscula"
;;
esac
for var in val1 val2 ... valn
do
comando1
comando2
...
done
for num in 1 2 3 4 5
do
echo "O número atual é $num!"
done
for arquivo in alunos*
do
echo "O arquivo atual é $arquivo"
done
for sequencia in $(seq 5 10)
do
echo "O número é $sequencia"
done
for sequencia in {5..10}
do
echo "O número é $sequencia"
done
for sequencia in $(seq 1 5 50)
do
echo "num $sequencia"
done
for sequencia in {1..50..5}
do
echo "O número é $sequencia"
done
for i in $(cat arquivo.txt)
do
echo "O valor atual é $i"
done
for ((i=5 ; i <=20 ; i++))
do
echo "o número é $i"
done
set|grep IFS: mostra os valores padrões do IFS
for var in $(cat ../CursoShellScript/arquivos/alunos2.txt)
do
echo "exibindo valor: $var"
done
# Exibe um valor a cada vez q encontrar um espaço ou uma quebra de linha
# exibindo valor: Andre
# exibindo valor: Gonçalves
# exibindo valor: Paulo
# exibindo valor: Freitas
# exibindo valor: Maria
# exibindo valor: Antonieto
OLDIFS=$IFS
IFS=:
for var in $(tail /etc/passwd)
do
echo "exibindo $var"
done
IFS=$OLDIFS
while <comando>
do
comando1
comando2
...
done
x=1
while [ $x -le 20 ]
do
echo "O valor atual é $x"
x=$(expr $x + 1)
done
while [ $(px axu | wc -l) -lt 300 ]
do
echo "Tudo ok"
sleep 30
done
while ls /var/lock/processo.lock > /dev/null
do
echo "Processo em execução"
sleep 30
done
until <comando>
do
comando 1
comando 2
done
x=1
until [ $x -eq 20 ]
do
echo O valor atual é $x
x=$(expr $x + 1)
done
until [ $(ps axu | wc -l) -ge 300 ]
do
echo "tudo ok"
sleep 30
done
while ls /var/lock/processo.lock > /dev/null
do
if [ $(date +%H) -gt 18 ]
then
break
fi
echo "processo em execução"
sleep 30
done
while ls /var/lock/processo.lock > /dev/null
do
if [ $(date +%H) -gt 18 ]
then
sleep 3600
continue
fi
echo "processo em execução"
sleep 30
done
function nome-funcao () {
}
nome-funcao () {
}
# chamando
nome-funcao
nome-funcao par1 par2
VAR1=$(nome-funcao)
# local
local VAR1="Shell script"
# retorn code pode ser de 0 a 255
return 10
# acesso do retorno
echo $?
# redireciona saida normal e de erro para um arquivo
./Script.sh >> log.out 2>&1
# redireciona saida normal e de erro para um arquivo e para a tela
./Script.sh | tee -a log.out
# redireciona todas as saídas do script em um arquivo
# mesmo sem especificar com > ou utulizar o tee
LOG="$HOME/Scripts/log_interno.out"
exec 1>> $LOG
exec 2>&1
echo "teste"
echo "teste 2"
LOG="$HOME/Scripts/log_interno.out"
# mostra na tela e coloca no arquivo de log
exec 1>> >(tee -a "$LOG")
exec 2>&1
echo "teste"
echo "teste 2"
- instalar o rsyslog:
sudo apt-get -y install rsyslog - criar um arquivo novo em /etc/rsyslog.d/scripts.conf
- criar os facilities, priorities e caminho:
# facilities.pririties path
local0.* /var/log/scripts.log
local1.* /var/log/scripts.log
local2.* /var/log/outroscript.log
- reiniciar o rsyslog: service rsyslog restart (systemctl restart rsyslog)
- verificar se reiniciou olhando o horário do processo: ps axu | grep rsyslog
- (opcional) criar o arquivo de log: touch /var/log/scripts.log
- (opcional) mudar permissão do arquivo de log para as mesmas do syslog: chown syslog:adm scripts.log
- para criar logs dentro do script, utilize o comando:
logger -p local0.err "teste de mensagem de erro" - para criar logs dentro do script com tag:
logger -p local0.warn -t [Script Novo] "teste de mensagem de erro" - para criar logs e mostrar na tela:
sort $ARQUIVOALUNOS | tee -a >(logger -p local0.warn -t [$0])
- instalar o cliente de email:
sudo apt-get install bsd-mailx - instalar o postfix para enviar emails internos:
sudo apt-get install postfix - reiniciar o postfix:
service postfix restart(https://www.tecmint.com/setup-postfix-mail-server-in-ubuntu-debian/) - enviando email:
mail -s "assunto" mail@email.com < arquivo.txt # se for local, nome do usuário: ex ricardo
# ou
echo "teste email" | mail -s "testando" mail@email.com # se for local, nome do usuário ex: root
- verificando caixa de entrada de email:
mail
- instalação:
sudo apt-get install mutt
- instalação:
sudo apt-get install sendemail - github: https://github.com/mogaal/sendemail
- tutorial: https://www.vivaolinux.com.br/artigo/Enviando-emails-pelo-terminal
- importante para verificar a sintax sem executar o script, evitar casos onde o script deleta um arquivo ou faz alguma modificação antes de estourar o erro:
bash -n Script.sh
- mostra com o sinal de
+todos os comandos que foram executados e o seu resultado, caso haja execução em sub-shell, utiliza o++para indicar:
bash -x Script.sh
- mostra o bloco que será executado e em seguida o resultado da execução:
bash -v Script.sh
- mostra o bloco, a execução e o resultado, funciona melhor para validar ifs
bash -xv Script.sh
- utilizado para executar a duperação (debug) dentro do script em determinado trechos.
echo "inicio debug"
echo
set -xv
date
echo "testando"
set +xv
echo "fim do debug
- executa o script passo a passo, aguarda pressionar o enter a cada linha executada.
clear
echo "inicio debug"
echo
set -xv
trap read DEBUG # começa o debug passo a passo
date
echo "testando"
trap "" DEBUG # Finalizando a execução passo a passo
echo "fim do debug