Hoje vamos falar sobre bash scripts. Isso é — , escritos para o shell bash. Existem outros shells, como zsh, tcsh, ksh, mas vamos nos concentrar no bash. Este material é destinado a todos os interessados, o único requisito é saber trabalhar na Linux.
Scripts de linha de comando são conjuntos dos mesmos comandos que podem ser digitados no teclado, reunidos em arquivos e combinados com um objetivo comum. Os resultados da execução dos comandos podem ter valor próprio ou servir como entrada para outros comandos. Scripts são uma maneira poderosa de automatizar ações frequentemente executadas.
Então, se falarmos sobre a linha de comando, ela permite executar vários comandos de uma só vez, digitando-os separados por ponto e vírgula:
pwd ; whoami Na verdade, se você testou isso no seu terminal, seu primeiro bash script, que envolve dois comandos, já foi escrito. Funciona assim. Primeiro, o comando pwd exibe na tela informações sobre o diretório de trabalho atual, depois o comando whoamimostra os dados do usuário que está logado no sistema.
Usando essa abordagem, você pode combinar quantos comandos quiser em uma única linha, a única limitação é o número máximo de argumentos que pode ser passado para o programa. Essa limitação pode ser determinada com o seguinte comando:
getconf ARG_MAXA linha de comando é uma ótima ferramenta, mas os comandos precisam ser digitados cada vez que necessário. Que tal gravar um conjunto de comandos em um arquivo e simplesmente chamar esse arquivo para executá-los? Na verdade, o arquivo do qual estamos falando é chamado de script de linha de comando.
Como são estruturados os bash scripts
Crie um arquivo vazio usando o comando touch. Na sua primeira linha, é necessário indicar qual shell vamos utilizar. Nos interessa bash, portanto a primeira linha do arquivo será assim:
#!/bin/bash Nas outras linhas desse arquivo, o símbolo de sustenido é usado para denotar comentários que o shell não processa. No entanto, a primeira linha é um caso especial, onde o sustenido seguido de um ponto de exclamação (essa sequência é chamada de ) e o caminho para bash, informam ao sistema que o script foi criado especificamente para bash.
Os comandos do shell são separados por quebras de linha, e os comentários são destacados pelo símbolo de sustenido. Veja como isso fica:
#!/bin/bash
# This is a comment
pwd
whoamiAqui, assim como na linha de comando, você pode escrever comandos em uma linha, separando-os com ponto e vírgula. No entanto, se você escrever comandos em linhas diferentes, o arquivo ficará mais fácil de ler. De qualquer forma, o shell os processará.
Definindo permissões para o arquivo de script
Salve o arquivo, dando a ele o nome myscript, e o trabalho de criação do script bash está quase finalizado. Agora, só falta tornar este arquivo executável; caso contrário, ao tentar executá-lo, você encontrará um erro Permission denied.

Tentativa de executar o arquivo de script com permissões configuradas incorretamente
Vamos tornar o arquivo executável:
chmod +x .\/myscriptAgora vamos tentar executá-lo:
.\/myscriptApós ajustar as permissões, tudo funciona como deveria.

Execução bem-sucedida do script bash
Saída de mensagens
Para exibir texto no console do Linux, utiliza-se o comando echo. Vamos usar esse conhecimento e editar nosso script, adicionando explicações aos dados que as já existentes comandos dele exibem:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiAqui está o que acontecerá após a execução do script atualizado.

Saída de mensagens do script
Agora podemos exibir descrições, utilizando o comando echo. Se você não souber como editar um arquivo utilizando os recursos do Linux, ou se nunca se deparou com o comando echo, dê uma olhada no material.
Uso de variáveis
As variáveis permitem armazenar informações no arquivo de script, como os resultados do trabalho dos comandos para uso por outros comandos.
Não há nada de errado em executar comandos individuais sem armazenar os resultados, mas as possibilidades dessa abordagem são bastante limitadas.
Existem dois tipos de variáveis que podem ser usadas em scripts bash:
- Variáveis de ambiente
- Variáveis de usuário
Variáveis de ambiente
Às vezes, em scripts de shell, é necessário trabalhar com certos dados do sistema. Por exemplo, veja como exibir o diretório home do usuário atual:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Observe que podemos usar a variável de sistema $HOME entre aspas duplas, isso não impedirá que o sistema a reconheça. Veja o que acontecerá se executarmos o script acima.

Uso de variável de ambiente em um script
E se quisermos exibir o símbolo de dólar na tela? Vamos tentar assim:
echo "Eu tenho $1 no meu bolso" O sistema detectará o sinal de dólar na string, delimitada por aspas, e decidirá que estamos nos referindo a uma variável. O script tentará exibir o valor de uma variável indefinida $1. Isso não é o que precisamos. O que fazer?
Nessa situação, podemos usar o caractere de escape, uma barra invertida, antes do símbolo de dólar:
echo "Eu tenho $1 no meu bolso"Agora o script exibirá exatamente o que se espera.

Uso de sequência de controle para exibir o símbolo de dólar
Variáveis de usuário
Além das variáveis de ambiente, scripts bash permitem criar e usar suas próprias variáveis no script. Essas variáveis armazenam o valor até que a execução do script seja concluída.
Assim como nas variáveis do sistema, as variáveis de usuário podem ser acessadas usando o símbolo de dólar:
TNW-CUS-FMP — um código promocional para 10% de desconto em nossos serviços, disponível para ativação por 7 dias
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Veja o que acontece após a execução desse script.

Variáveis de usuário no script
Substituição de comandos
Uma das funcionalidades mais úteis dos scripts bash é a capacidade de extrair informações da saída de comandos e atribuí-las a variáveis, permitindo usar essas informações em qualquer lugar do arquivo de script.
Isso pode ser feito de duas maneiras.
- Usando o símbolo de acento grave «`»
- Usando a construção
$()
Ao usar a primeira abordagem, certifique-se de não inserir uma aspa simples em vez do acento grave. O comando deve ser delimitado por dois desses símbolos:
mydir=`pwd`Na segunda abordagem, a mesma coisa é escrita assim:
mydir=$(pwd)E o script, no final, pode parecer assim:
#!/bin/bash
mydir=$(pwd)
echo $mydir Durante sua execução, a saída do comando pwdserá salva na variável mydir, cujo conteúdo, através do comando echo, aparecerá no console.

Script que armazena os resultados da execução de um comando em uma variável
Operações matemáticas
Para realizar operações matemáticas em um arquivo de script, você pode usar a seguinte construção $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operações matemáticas em scripts
Construção de controle if-then
Em alguns scripts, é necessário controlar o fluxo de execução dos comandos. Por exemplo, se um determinado valor for maior que cinco, uma ação deve ser executada; caso contrário, outra deve ser realizada. Isso se aplica a várias situações, e é aqui que a construção de controle nos ajuda. if-then. Em sua forma mais simples, ela se apresenta assim:
if comando
then
comandos
fiAqui está um exemplo funcional:
#!/bin/bash
if pwd
then
echo "It works"
fi Neste caso, se a execução do comando pwdfor bem-sucedida, a mensagem «it works» será exibida no console.
Vamos usar o que já sabemos e escrever um script mais complexo. Digamos, precisamos encontrar um determinado usuário em /etc/passwd, e se encontrá-lo for bem-sucedido, informar que ele existe.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiAqui está o que acontece após executar este script.

Busca de usuário
Aqui usamos o comando greppara buscar um usuário no arquivo /etc/passwd. Se o comando grepé novo para você, sua descrição pode ser encontrada .
Neste exemplo, se o usuário for encontrado, o script exibirá a mensagem correspondente. Mas e se não conseguirmos localizar o usuário? Nesse caso, o script simplesmente terminará a execução, sem nos informar. Gostaríamos que ele dissesse isso também, portanto, vamos aprimorar o código.
Construção de controle if-then-else
Para que o programa possa relatar tanto os resultados de uma busca bem-sucedida quanto de uma falha, utilizaremos a construção if-then-else. Aqui está como ela funciona:
if comando
then
comandos
else
comandos
fi Se o primeiro comando retornar zero, o que significa que foi executado com sucesso, a condição será verdadeira e a execução não seguirá pelo ramo else. Caso contrário, se algo diferente de zero for retornado, o que significará uma falha ou um resultado falso, os comandos localizados após else.
serão executados. Vamos escrever um script assim:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Sua execução seguiu pelo ramo else.

Execução do script com a construção if-then-else
Bem, continuamos avançando e nos deparamos com a questão de condições mais complexas. E se precisarmos verificar mais de uma condição? Por exemplo, se o usuário desejado for encontrado, precisamos exibir uma mensagem; se outra condição for atendida, exibimos outra mensagem, e assim por diante. Nessa situação, condições aninhadas podem nos ajudar. Veja como fica:
if comando1
then
comandos
elif comando2
then
comandos
fi Se o primeiro comando retornar zero, o que indica que foi executado com sucesso, os comandos no primeiro bloco serão executados. then, caso contrário, se a primeira condição for falsa e o segundo comando retornar zero, o segundo bloco de código será executado.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi Em um script como esse, você pode, por exemplo, criar um novo usuário usando o comando useradd, se a busca não retornar resultados, ou fazer algo mais útil.
Comparação de números
Nos scripts, é possível comparar valores numéricos. Abaixo está uma lista dos comandos correspondentes.
n1 -eq n2Retorna verdadeiro sen1for igual an2.
n1 -ge n2Retorna verdadeiro sen1maior ou igual an2.
n1 -gt n2Retorna verdadeiro sen1maisn2.
n1 -le n2Retorna verdadeiro sen1menor ou igual an2.
n1 -lt n2Retorna verdadeiro se n1 for menor quen2.
n1 -ne n2Retorna verdadeiro sen1diferente den2.
Como exemplo, vamos testar um dos operadores de comparação. Note que a expressão está entre colchetes.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiIsso é o que este comando irá exibir.

Comparação de números em scripts
O valor da variável val1é maior que 5, assim sendo, a ramificação do operador de comparação é executada e a mensagem correspondente é exibida no console. thenComparação de strings
Nos scripts, também é possível comparar valores de strings. Os operadores de comparação parecem bastante simples, mas as operações de comparação de strings têm algumas particularidades que abordaremos a seguir. Aqui está a lista dos operadores.
str1 = str2
Verifica a igualdade das strings e retorna verdadeiro se as strings forem idênticas.str1 != str2
sRetorna verdadeiro se as strings não forem idênticas.str1 < str2
Retorna verdadeiro sestr1for menor questr2str1 > str2.
maior questr1for menor que-n str1str1 > str2.
Retorna verdadeiro se o comprimentofor maior que zero.for menor que-z str1
for igual a zero.for maior que zero.for menor queAqui está um exemplo de comparação de strings em um script:
Como resultado da execução do script, teremos o seguinte.
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiComparação de strings em scripts

Comparação de strings em scripts
Uma característica do comparativo de strings que vale a pena mencionar é que os operadores ">" e "" como um comando de redirecionamento de saída.
Aqui está como o trabalho com esses operadores se apresenta no código:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAqui estão os resultados da execução do script.

Comparação de strings, aviso exibido
Observe que o script, embora execute, emite um aviso:
.\/myscript: linha 5: [: muitos argumentos Para eliminar esse aviso, envolva $val2 entre aspas duplas:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAgora tudo funciona como deve.

Nos scripts, também é possível comparar valores de strings. Os operadores de comparação parecem bastante simples, mas as operações de comparação de strings têm algumas particularidades que abordaremos a seguir. Aqui está a lista dos operadores.
Outra característica dos operadores ">" e "<" é como eles lidam com caracteres em maiúsculas e minúsculas. Para entender essa característica, vamos preparar um arquivo de texto com o seguinte conteúdo:
Likegeeks
likegeeks Vamos salvá-lo com o nome myfile, e em seguida, executar no terminal o seguinte comando:
sort myfileIsso irá classificar as linhas do arquivo da seguinte maneira:
likegeeks
Likegeeks Time sort, por padrão, classifica as linhas em ordem crescente, ou seja, uma letra minúscula no nosso exemplo é menor que uma maiúscula. Agora vamos preparar um script que irá comparar as mesmas strings:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSe for executado, descobrirá que tudo está invertido — a letra minúscula agora é maior que a maiúscula.

O comando sort e a comparação de strings no arquivo do script
Nos comandos de comparação, letras maiúsculas são consideradas menores que minúsculas. A comparação de strings aqui é feita comparando os códigos ASCII dos caracteres; a ordem de classificação, assim, depende dos códigos dos caracteres.
Time sort, por sua vez, utiliza a ordem de classificação definida nas configurações do idioma do sistema.
Verificações de arquivos
Talvez os seguintes comandos sejam os mais comumente usados em scripts bash. Eles permitem verificar diferentes condições relacionadas a arquivos. Aqui está uma lista desses comandos.
-d fileVerifica se o arquivo existe e se é um diretório.
-e fileVerifica se o arquivo existe.
-f fileVerifica se o arquivo existe e se é um arquivo.
-r fileVerifica se o arquivo existe e está acessível para leitura.
-s fileVerifica se o arquivo existe e não está vazio.
-w fileVerifica se o arquivo existe e está acessível para gravação.
-x fileVerifica se o arquivo existe e é executável.
file1 -nt file2Verifica se é mais recente quefile1, do quefile2.
file1 -ot file2Verifica se é mais antigo quefile1, do quefile2.
-O fileVerifica se o arquivo existe e se o proprietário é o usuário atual.
-G fileVerifica se o arquivo existe e se o seu ID de grupo corresponde ao ID de grupo do usuário atual.
Esses comandos, assim como muitos outros abordados hoje, são fáceis de lembrar. Seus nomes, sendo abreviações de várias palavras, indicam diretamente as verificações que realizam.
Vamos testar um dos comandos na prática:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiEste script, para um diretório existente, exibirá seu conteúdo.

Exibindo o conteúdo do diretório
Acreditamos que, com os outros comandos, você poderá experimentar por conta própria, todos eles são aplicados de acordo com o mesmo princípio.
Resultados
Hoje falamos sobre como começar a escrever scripts em bash e discutimos algumas coisas básicas. Na verdade, o tema da programação em bash é enorme. Este artigo é a tradução da primeira parte de uma grande série de 11 materiais. Se você deseja a continuidade agora mesmo — aqui está a lista original desses materiais. Para facilitar, incluímos também aquele cuja tradução você acaba de ler.
- — aqui discute-se como começar a criar bash scripts, o uso de variáveis, a descrição de estruturas condicionais, cálculos, comparação de números e strings, e a obtenção de informações sobre arquivos.
- — aqui são exploradas as características do trabalho com os loops for e while.
- — este material é dedicado aos parâmetros da linha de comando e às chaves que podem ser passadas para scripts, ao trabalho com dados que o usuário insere e que podem ser lidos de arquivos.
- — aqui discute-se sobre descritores de arquivos e como trabalhá-los, sobre fluxos de entrada, saída, erros, e redirecionamento de saída.
- — este material é dedicado aos sinais do Linux, seu tratamento em scripts e a execução de scripts programados.
- — aqui você pode aprender a criar e usar funções em scripts, sobre o desenvolvimento de bibliotecas.
- — este artigo é dedicado ao trabalho com o editor de texto de fluxo sed.
- — este material é dedicado à programação na linguagem de processamento de dados awk.
- — aqui você pode ler sobre o uso de expressões regulares em scripts bash.
- — aqui estão apresentados métodos de trabalho com mensagens que podem ser enviadas aos usuários, bem como a metodologia de monitoramento de disco.
- — este material é dedicado à ferramenta Expect, que permite automatizar a interação com utilitários interativos. Em particular, discute-se aqui os scripts expect e sua interação com scripts bash e outros programas.
Acreditamos que uma das propriedades valiosas desta série de artigos é que ela, começando com o mais simples, adequado para usuários de qualquer nível, gradualmente leva a temas bastante severos, dando a todos os interessados a chance de avançar na criação de scripts de linha de comando no Linux.
Caros leitores! Pedimos aos gurus da programação bash que compartilhem como alcançaram os píncaros da maestria, compartilhem segredos, e daqueles que acabaram de escrever seu primeiro script, aguardamos impressões.
Apenas usuários registrados podem participar da pesquisa. , por favor.
Traduzir as outras partes do ciclo de artigos?
Sim!
Não, não é necessário
Votaram 1030 usuários. 106 usuários se abstiveram.
Fonte: habr.com
