Comandos principais do shell script
cd ..
oucd ../../Downloads
: subir de nivelcd -
: volta para o anteriorcd
oucd ~
: 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 dea
pore
cat arquivo| tr a-z A-Z
: troca toda letra minúscula por maiúsculacat arquivo| tr aei AEI
: trocaaei
porAEI
cat arquivo| tr ' ' '\t'
: troca espaço por tabcat arquivo| tr -d aei
: remove as letrasaei
echo "Curso Shell Script"| tr -s 'l'
: comprime ol
para 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$0
ou$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.sh
ou. 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