códigoLivre

Entendendo bash script

Bash é o nome do shell do Unix, que também é distribuído como shell do sistema operacional GNU e como shell padrão para a maioria das distros Linux.

Praticamente todos os exemplos abaixo podem fazer parte de um shell script e podem ser executados diretamente no shell.

Leia mais sobre

Olá, mundo!

1#!/bin/bash
2# A primeira linha do script é o shebang (#!), que conta para o sistema como
3# executar o script: http://en.wikipedia.org/wiki/Shebang_(Unix)
4# Como você já deve ter percebido, comentários começam com #.
5# Shebang também é um comentário.
6

Exemplo simples de hello world:

1#!/bin/bash
2echo Hello World!

Cada comando começa com uma nova linha, ou após um ponto e vírgula:

1#!/bin/bash
2echo 'Essa é a primeira linha'; echo 'Essa é a segunda linha'

Variáveis

A declaração de variáveis é mais ou menos assim:

1Variavel="Alguma string"
2
3# Mas não assim:
4Variavel = "Alguma string"
5# Bash interpretará Variavel como um comando e tentará executar e lhe retornará
6# um erro porque o comando não pode ser encontrado.
7
8# Ou assim:
9Variavel= 'Alguma string'
10# Bash interpretará 'Alguma string' como um comando e tentará executar e lhe retornará
11# um erro porque o comando não pôde ser encontrado. (Nesse caso a a parte 'Variavel='
12# é vista com uma declaração de variável válida apenas para o escopo do comando 'Uma string').

Usando a variável:

1echo $Variavel
2echo "$Variavel"
3echo '$Variavel'
4# Quando você usa a variável em si — declarando valor, exportando, etc — você escreve
5# seu nome sem o $. Se você quer usar o valor da variável você deve usar o $.
6# Note que ' (aspas simples) não expandirão as variáveis!
7
8# Substituição de strings em variáveis
9echo ${Variavel/Alguma/Uma}
10# Isso substituirá a primeira ocorrência de "Alguma" por "Uma"
11
12# Substring de uma variável
13Tamanho=7
14echo ${Variavel:0:Tamanho}
15# Isso retornará apenas os 7 primeiros caracteres da variável
16
17# Valor padrão de uma variável
18echo ${Foo:-"ValorPadraoSeFooNaoExistirOuEstiverVazia"}
19# Isso funciona para nulo (Foo=) e (Foo=""); zero (Foo=0) retorna 0.
20# Note que isso apenas retornará o valor padrão e não mudará o valor da variável.

Variáveis especiais

Bash inclui por padrão variáveis muito úteis, como:

1#!/bin/bash
2echo "O ultimo retorno do programa: $?"
3echo "PID do script: $$"
4echo "Numero de argumentos passados para o script $#"
5echo "Todos os argumentos passados para o script [email protected]"
6echo "Os argumentos do script em variáveis diferentes: $1, $2..."
7
8# Lendo o valor do input:
9echo "Qual o seu nome?"
10read Nome # Note que nós não precisamos declarar a variável
11echo Ola, $Nome
12
13# Agora que sabemos como imprimir e usar variáveis,
14# bora aprender alguns dos outros princípios básicos do bash!
15
16# Nosso diretório atual está disponível através do comando `pwd`.
17# `pwd` significa "print working directory" ou "imprima o diretório atual".
18# Também podemos usar a variável especial `$PWD`.
19# Observe que os seguintes comandos são equivalentes:
20echo "I'm in $(pwd)" # executa o comando `pwd` e interpola seu output
21echo "I'm in $PWD" # interpola o valor da variável $PWD

Arrays

1# Declara uma array com 6 elementos
2array0=(um dois tres quatro cinco seis)
3# Imprime o primeiro elemento
4echo $array0 # => "um"
5# Imprime o primeiro elemento
6echo ${array0[0]} # => "um"
7# Imprime todos os elementos
8echo ${array0[@]} # => "um dois tres quatro cinco seis"
9# Imprime número de elementos
10echo ${#array0[@]} # => "6"
11# Imprime o número de caracteres no terceiro elemento
12echo ${#array0[2]} # => "5"
13# Imprime 2 elementos a partir do quarto
14echo ${array0[@]:3:2} # => "quatro cinco"
15# Imprime todos os elementos. Cada um deles em nova linha.
16for i in "${array0[@]}"; do
17 echo "$i"
18done
19
20# Brace Expansion { }
21# Usada para gerar strings arbitrárias
22echo {1..10} # => 1 2 3 4 5 6 7 8 9 10
23echo {a..z} # => a b c d e f g h i j k l m n o p q r s t u v w x y z
24# Isso imprimirá a faixa de valores do inicial ao valor final

Condicionais

Nós temos a estrutura if normal:

1# use 'man test' para mais informações sobre as condicionais
2if [ $Nome -ne $USER ]
3then
4 echo "Seu nome não é o seu username"
5else
6 echo "Seu nome é seu username"
7fi

A execução condicional:

1echo "Sempre executado" || echo "Somente executado se o primeiro falhar"
2echo "Sempre executado" && "Só executado se o primeiro NÃO falhar"
3
4# Para usar && e || com o if, você precisa multiplicar os pares de colchetes
5if [ $Nome == "Estevao"] && [ $Idade -eq 15]
6then
7 echo "Isso vai rodar se $Nome é igual Estevao E $Idade é 15."
8fi
9
10fi [ $Nome == "Daniela" ] || [ $Nome = "Jose" ]
11then
12 echo "Isso vai rodar se $Nome é Daniela ou Jose."
13fi

Expressões e execução de comandos

1# Expressões são escritas com o seguinte formato
2echo $(( 10 + 5))
3
4# Diferentemente das outras linguagens de programação, bash é um shell, então ele
5# funciona no diretório atual. Você pode listar os arquivos e diretórios no diretório
6# atual com o comando ls:
7ls
8
9# Esse comando tem opções que controlam sua execução
10ls -l # Lista todo arquivo e diretório em linhas separadas
11
12# Os resultados do comando anterior podem ser passados para outro comando como input.
13# O comando grep filtra o input com o padrão passado. É assim que listamos apenas
14# os arquivos .txt no diretório atual:
15ls -l | grep "\.txt"
16
17# Você pode redirecionar o comando de input e output (stdin, stdout e stderr).
18# Lê o stdin até ^EOF$ e sobrescreve hello.py com as linhas entre "EOF":
19cat > hello.py << EOF
20#!/usr/bin/env python
21from __future__ imprt print_function
22import sys
23print("#stdout", file=sys.stdout)
24print("stderr", file=sys.stderr)
25for line in sys.stdin:
26 print(line, file=sys.stdout)
27EOF
28
29# Rode hello.py com várias instruções stdin, stdout e stderr:
30python hello.py < "input.in"
31python hello.py > "ouput.out"
32python hello.py 2> "error.err"
33python hello.py > "output-and-error.log" 2>&1
34python hello.py > /dev/null 2>&1
35# O erro no output sobrescreverá o arquivo se existir,
36# se ao invés disso você quiser complementar, use ">>":
37python hello.py >> "output.out" 2>> "error.err"
38
39# Sobrescreve output.out, complemente para error.err e conta as linhas
40info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err
41wc -l output.out error.err
42
43#Roda um comando e imprime o desencriptador (e.g. /dev/fd/123)
44# veja: man fd
45echo <(echo "#helloworld")
46
47# Sobrescreve ouput.out com "#helloworld":
48cat > output.out <(echo "#helloworld")
49echo "#helloworld" > output.out
50echo "#helloworld" | cat > output.out
51echo "#helloworld" | tee output.out > /dev/null
52
53# Limpa os arquivos temporários detalhando quais foram deletados (use '-i' para confirmar exclusão)
54rm -v output.out error.err output-and-error.log
55
56# Comando podem ser substituídos por outros comandos usando $( ):
57# O comando a seguir mostra o número de arquivos e diretórios no diretório atual
58echo "Existem $(ls | wc -l) itens aqui."
59
60# O mesmo pode ser feito usando crase `` mas elas não podem ser aninhadas - dá se
61# preferência ao uso do $( )
62echo "Existem `ls | wc -l` itens aqui."
63
64# Bash usa o comando case que funciona de uma maneira similar ao switch de Java e C++:
65case "$Variavel" in
66 # Lista de parametros para condições que você quer encontrar
67 0) echo "Isso é um Zero.";;
68 1) echo "Isso é um Um.";;
69 *) echo "Isso não é null.";;
70esac
71
72# loops for iteragem para quantos argumentos passados:
73# O conteudo de $Variavel é exibido três vezes.
74for Variavel in {1..3}
75do
76 echo "$Variavel"
77done
78
79# Ou use o loop da "maneira tradicional":
80for ((a=1; a <= 3; a++))
81do
82 echo $a
83done
84
85# Eles também podem ser usados em arquivos...
86# Isso irá rodar o comando 'cat' em arquivo1 e arquivo2
87for Variavel in arquivo1 arquivo2
88do
89 cat "$Variavel"
90done
91
92# ...ou o output de um comando
93# Isso irá usar cat no output do ls.
94for Output in $(ls)
95do
96 cat "$Output"
97done
98
99# loop while:
100while [ true ]
101do
102 echo "corpo do loop aqui..."
103 break
104done

Funções

1# Definição:
2function foo() {
3 echo "Argumentos funcionam bem assim como os dos scripts: [email protected]"
4 echo "E: $1 $2..."
5 echo "Isso é uma função"
6 return 0
7}
8
9# ou simplesmente
10bar () {
11 echo "Outro jeito de declarar funções!"
12 return 0
13}
14
15# Chamando sua função
16foo "Meu nome é" $Nome

Misc

Outros comandos úteis:

1# exibe as 10 ultimas linhas de arquivo.txt
2tail -n 10 arquivo.txt
3# exibe as primeiras 10 linhas de arquivo.txt
4head -n 10 arquivo.txt
5# ordena as linhas de arquivo.txt
6sort arquivo.txt
7# reporta ou omite as linhas repetidas, com -d você as reporta
8uniq -d arquivo.txt
9# exibe apenas a primeira coluna após o caractere ','
10cut -d ',' -f 1 arquivo.txt
11# substitui todas as ocorrencias de 'okay' por 'legal' em arquivo.txt (é compativel com regex)
12sed -i 's/okay/legal/g' file.txt
13# exibe para o stdout todas as linhas do arquivo.txt que encaixam com o regex
14# O exemplo exibe linhas que começam com "foo" e terminam com "bar"
15grep "^foo.*bar$" arquivo.txt
16# passe a opção "-c" para ao invés de imprimir o número da linha que bate com o regex
17grep -c "^foo.*bar$" arquivo.txt
18# se você quer literalmente procurar por uma string,
19# e não pelo regex, use fgrep (ou grep -F)
20fgrep "^foo.*bar$" arquivo.txt
21
22
23# Leia a documentação interna do shell Bash com o comando interno 'help':
24help
25help help
26help for
27help return
28help source
29help .
30
31# Leia a página principal da documentação com man
32apropos bash
33man 1 bash
34man bash
35
36# Leia a documentação de informação com info (? para ajuda)
37apropos info | grep '^info.*('
38man info
39info info
40info 5 info
41
42# Leia a documentação informativa do Bash:
43info bash
44info bash 'Bash Features'
45info bash 6
46info --apropos bash

© 2021

TwitterYouTubeInstagramGitHubRSS Feed