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.
Olá, mundo!
1#!/bin/bash2# A primeira linha do script é o shebang (#!), que conta para o sistema como3# 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/bash2echo Hello World!
Cada comando começa com uma nova linha, ou após um ponto e vírgula:
1#!/bin/bash2echo 'Essa é a primeira linha'; echo 'Essa é a segunda linha'
Variáveis
A declaração de variáveis é mais ou menos assim:
1Variavel="Alguma string"23# 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.78# 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 $Variavel2echo "$Variavel"3echo '$Variavel'4# Quando você usa a variável em si — declarando valor, exportando, etc — você escreve5# 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!78# Substituição de strings em variáveis9echo ${Variavel/Alguma/Uma}10# Isso substituirá a primeira ocorrência de "Alguma" por "Uma"1112# Substring de uma variável13Tamanho=714echo ${Variavel:0:Tamanho}15# Isso retornará apenas os 7 primeiros caracteres da variável1617# Valor padrão de uma variável18echo ${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/bash2echo "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..."78# Lendo o valor do input:9echo "Qual o seu nome?"10read Nome # Note que nós não precisamos declarar a variável11echo Ola, $Nome1213# Agora que sabemos como imprimir e usar variáveis,14# bora aprender alguns dos outros princípios básicos do bash!1516# 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 output21echo "I'm in $PWD" # interpola o valor da variável $PWD
Arrays
1# Declara uma array com 6 elementos2array0=(um dois tres quatro cinco seis)3# Imprime o primeiro elemento4echo $array0 # => "um"5# Imprime o primeiro elemento6echo ${array0[0]} # => "um"7# Imprime todos os elementos8echo ${array0[@]} # => "um dois tres quatro cinco seis"9# Imprime número de elementos10echo ${#array0[@]} # => "6"11# Imprime o número de caracteres no terceiro elemento12echo ${#array0[2]} # => "5"13# Imprime 2 elementos a partir do quarto14echo ${array0[@]:3:2} # => "quatro cinco"15# Imprime todos os elementos. Cada um deles em nova linha.16for i in "${array0[@]}"; do17 echo "$i"18done1920# Brace Expansion { }21# Usada para gerar strings arbitrárias22echo {1..10} # => 1 2 3 4 5 6 7 8 9 1023echo {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 z24# 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 condicionais2if [ $Nome -ne $USER ]3then4 echo "Seu nome não é o seu username"5else6 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"34# Para usar && e || com o if, você precisa multiplicar os pares de colchetes5if [ $Nome == "Estevao"] && [ $Idade -eq 15]6then7 echo "Isso vai rodar se $Nome é igual Estevao E $Idade é 15."8fi910fi [ $Nome == "Daniela" ] || [ $Nome = "Jose" ]11then12 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 formato2echo $(( 10 + 5))34# Diferentemente das outras linguagens de programação, bash é um shell, então ele5# funciona no diretório atual. Você pode listar os arquivos e diretórios no diretório6# atual com o comando ls:7ls89# Esse comando tem opções que controlam sua execução10ls -l # Lista todo arquivo e diretório em linhas separadas1112# 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 apenas14# os arquivos .txt no diretório atual:15ls -l | grep "\.txt"1617# 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 << EOF20#!/usr/bin/env python21from __future__ imprt print_function22import sys23print("#stdout", file=sys.stdout)24print("stderr", file=sys.stderr)25for line in sys.stdin:26 print(line, file=sys.stdout)27EOF2829# 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>&134python hello.py > /dev/null 2>&135# 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"3839# Sobrescreve output.out, complemente para error.err e conta as linhas40info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err41wc -l output.out error.err4243#Roda um comando e imprime o desencriptador (e.g. /dev/fd/123)44# veja: man fd45echo <(echo "#helloworld")4647# Sobrescreve ouput.out com "#helloworld":48cat > output.out <(echo "#helloworld")49echo "#helloworld" > output.out50echo "#helloworld" | cat > output.out51echo "#helloworld" | tee output.out > /dev/null5253# Limpa os arquivos temporários detalhando quais foram deletados (use '-i' para confirmar exclusão)54rm -v output.out error.err output-and-error.log5556# 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 atual58echo "Existem $(ls | wc -l) itens aqui."5960# O mesmo pode ser feito usando crase `` mas elas não podem ser aninhadas - dá se61# preferência ao uso do $( )62echo "Existem `ls | wc -l` itens aqui."6364# Bash usa o comando case que funciona de uma maneira similar ao switch de Java e C++:65case "$Variavel" in66 # Lista de parametros para condições que você quer encontrar67 0) echo "Isso é um Zero.";;68 1) echo "Isso é um Um.";;69 *) echo "Isso não é null.";;70esac7172# loops for iteragem para quantos argumentos passados:73# O conteudo de $Variavel é exibido três vezes.74for Variavel in {1..3}75do76 echo "$Variavel"77done7879# Ou use o loop da "maneira tradicional":80for ((a=1; a <= 3; a++))81do82 echo $a83done8485# Eles também podem ser usados em arquivos...86# Isso irá rodar o comando 'cat' em arquivo1 e arquivo287for Variavel in arquivo1 arquivo288do89 cat "$Variavel"90done9192# ...ou o output de um comando93# Isso irá usar cat no output do ls.94for Output in $(ls)95do96 cat "$Output"97done9899# loop while:100while [ true ]101do102 echo "corpo do loop aqui..."103 break104done
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 07}89# ou simplesmente10bar () {11 echo "Outro jeito de declarar funções!"12 return 013}1415# Chamando sua função16foo "Meu nome é" $Nome
Misc
Outros comandos úteis:
1# exibe as 10 ultimas linhas de arquivo.txt2tail -n 10 arquivo.txt3# exibe as primeiras 10 linhas de arquivo.txt4head -n 10 arquivo.txt5# ordena as linhas de arquivo.txt6sort arquivo.txt7# reporta ou omite as linhas repetidas, com -d você as reporta8uniq -d arquivo.txt9# exibe apenas a primeira coluna após o caractere ','10cut -d ',' -f 1 arquivo.txt11# substitui todas as ocorrencias de 'okay' por 'legal' em arquivo.txt (é compativel com regex)12sed -i 's/okay/legal/g' file.txt13# exibe para o stdout todas as linhas do arquivo.txt que encaixam com o regex14# O exemplo exibe linhas que começam com "foo" e terminam com "bar"15grep "^foo.*bar$" arquivo.txt16# passe a opção "-c" para ao invés de imprimir o número da linha que bate com o regex17grep -c "^foo.*bar$" arquivo.txt18# se você quer literalmente procurar por uma string,19# e não pelo regex, use fgrep (ou grep -F)20fgrep "^foo.*bar$" arquivo.txt212223# Leia a documentação interna do shell Bash com o comando interno 'help':24help25help help26help for27help return28help source29help .3031# Leia a página principal da documentação com man32apropos bash33man 1 bash34man bash3536# Leia a documentação de informação com info (? para ajuda)37apropos info | grep '^info.*('38man info39info info40info 5 info4142# Leia a documentação informativa do Bash:43info bash44info bash 'Bash Features'45info bash 646info --apropos bash