Como trabalhar com variáveis no Bash
Variáveis são vitais se você deseja escrever scripts e entender o que o código que você está prestes a recortar e colar da web fará em seu computador Linux. Vamos ajudá-lo a começar!
Variáveis 101
Variáveis são símbolos nomeados que representam uma string ou um valor numérico. Quando você os usa em comandos e expressões, eles são tratados como se você tivesse digitado o valor que contêm em vez do nome da variável.
Para criar uma variável, basta fornecer um nome e um valor para ela. Os nomes de suas variáveis devem ser descritivos e lembrá-lo do valor que possuem. Um nome de variável não pode começar com um número, nem pode conter espaços. No entanto, pode começar com um sublinhado. Além disso, você pode usar qualquer combinação de caracteres alfanuméricos maiúsculos e minúsculos.
Exemplos
Aqui, vamos criar cinco variáveis. O formato é digitar o nome, o sinal de igual =
e o valor. Observe que não há um espaço antes ou depois do sinal de igual. Atribuir um valor a uma variável é muitas vezes referido como atribuindo um valor para a variável.
Vamos criar quatro variáveis de string e uma variável numérica,este ano:
eu = Dave
my_boost = Linux
ele = Popeye
his_boost = Espinafre
this_year = 2019
Para ver o valor mantido em uma variável, use o eco
comando. Você deve preceder o nome da variável com um cifrão $
sempre que você fizer referência ao valor que ele contém, conforme mostrado a seguir:
echo $ my_name
echo $ my_boost
echo $ this_year
Vamos usar todas as nossas variáveis de uma vez:
echo "$ my_boost é para $ me como $ his_boost é para $ him (c) $ this_year"
Os valores das variáveis substituem seus nomes. Você também pode alterar os valores das variáveis. Para atribuir um novo valor à variável,my_boost
, você apenas repete o que fez quando atribuiu seu primeiro valor, assim:
my_boost = Tequila
Se você executar novamente o comando anterior, obterá um resultado diferente:
echo "$ my_boost é para $ me como $ his_boost é para $ him (c) $ this_year"
Portanto, você pode usar o mesmo comando que faz referência às mesmas variáveis e obter resultados diferentes se alterar os valores mantidos nas variáveis.
Falaremos sobre como citar variáveis mais tarde. Por enquanto, aqui estão algumas coisas a serem lembradas:
- Uma variável entre aspas simples
'
é tratado como uma string literal e não como uma variável. - Variáveis entre aspas
"
são tratados como variáveis. - Para obter o valor mantido em uma variável, você deve fornecer o cifrão
$
. - Uma variável sem o cifrão
$
fornece apenas o nome da variável.
Você também pode criar uma variável que obtém seu valor de uma variável existente ou de um número de variáveis. O seguinte comando define uma nova variável chamada bebida_do_ano,
e atribui a ele os valores combinados do my_boost
e este ano
variáveis:
drink_of-the_Year = "$ my_boost $ this_year"
echo drink_of_the-Year
Como usar variáveis em scripts
Os scripts seriam completamente paralisados sem variáveis. As variáveis fornecem a flexibilidade que torna um script uma solução geral, em vez de específica. Para ilustrar a diferença, aqui está um script que conta os arquivos no / dev
diretório.
Digite isso em um arquivo de texto e salve-o como fcnt.sh
(para “contagem de arquivos”):
#! / bin / bash folder_to_count = / dev file_count = $ (ls $ folder_to_count | wc -l) echo $ file_count arquivos em $ folder_to_count
Antes de executar o script, você deve torná-lo executável, conforme mostrado a seguir:
chmod + x fcnt.sh
Digite o seguinte para executar o script:
./fcnt.sh
Isso imprime o número de arquivos no / dev
diretório. Funciona assim:
- Uma variável chamada
folder_to_count
é definido e está configurado para conter a string "/ dev." - Outra variável, chamada
file_count
, é definido. Esta variável obtém seu valor de uma substituição de comando. Esta é a frase de comando entre os parênteses$( )
. Observe que há um cifrão$
antes do primeiro parêntese. Esta construção$( )
avalia os comandos entre parênteses e retorna seu valor final. Neste exemplo, esse valor é atribuído aofile_count
variável. Na medida em quefile_count
variável está em causa, é passado um valor para manter; não está preocupado com a forma como o valor foi obtido. - O comando avaliado na substituição do comando realiza um
ls
listagem de arquivos no diretório nofolder_to_count
variável, que foi definida como “/ dev.” Portanto, o script executa o comando “ls / dev.” - A saída deste comando é canalizada para o
Banheiro
comando. O-eu
(contagem de linha) causa da opçãoBanheiro
para contar o número de linhas na saída dols
comando. Como cada arquivo é listado em uma linha separada, esta é a contagem de arquivos e subdiretórios no diretório “/ dev”. Este valor é atribuído aofile_count
variável. - A linha final usa eco para produzir o resultado.
Mas isso só funciona para o diretório “/ dev”. Como podemos fazer o script funcionar com qualquer diretório? Basta uma pequena mudança.
Como usar parâmetros de linha de comando em scripts
Muitos comandos, como ls
e Banheiro
, use os parâmetros da linha de comando. Eles fornecem informações para o comando, para que ele saiba o que você deseja fazer. Se você quiserls
para trabalhar em seu diretório pessoal e também para mostrar arquivos ocultos, você pode usar o seguinte comando, onde o til ~
e a -uma
A opção (todos) são parâmetros de linha de comando:
ls ~ -a
Nossos scripts podem aceitar parâmetros de linha de comando. Eles são referenciados como $1
para o primeiro parâmetro, $2
como o segundo, e assim por diante, até $9
para o nono parâmetro. (Na verdade, há um $0
, também, mas isso é reservado para sempre manter o script.)
Você pode fazer referência a parâmetros de linha de comando em um script da mesma forma que faria com variáveis regulares. Vamos modificar nosso script, conforme mostrado abaixo, e salvá-lo com o novo nomefcnt2.sh
:
#! / bin / bash folder_to_count = $ 1 file_count = $ (ls $ folder_to_count | wc -l) echo $ file_count arquivos em $ folder_to_count
Desta vez, o folder_to_count
variável recebe o valor do primeiro parâmetro da linha de comando, $1
.
O resto do script funciona exatamente como antes. Em vez de uma solução específica, seu script agora é geral. Você pode usá-lo em qualquer diretório porque não está codificado para funcionar apenas com “/ dev.”
Veja como tornar o script executável:
chmod + x fcnt2.sh
Agora, experimente com alguns diretórios. Você pode fazer “/ dev” primeiro para ter certeza de obter o mesmo resultado de antes. Digite o seguinte:
./fnct2.sh / dev
./fnct2.sh / etc
./fnct2.sh / bin
Você obtém o mesmo resultado (207 arquivos) de antes para o diretório “/ dev”. Isso é encorajador e você obtém resultados específicos do diretório para cada um dos outros parâmetros da linha de comando.
Para encurtar o script, você pode dispensar a variável,folder_to_count
, completamente, e apenas referência $1
ao longo da seguinte forma:
#! / bin / bash file_count = $ (ls $ 1 wc -l) echo $ file_count arquivos em $ 1
Trabalhando com Variáveis Especiais
Nós mencionamos $0
, que sempre é definido como o nome do arquivo do script. Isso permite que você use o script para fazer coisas como imprimir seu nome corretamente, mesmo se ele for renomeado. Isso é útil em situações de registro, nas quais você deseja saber o nome do processo que adicionou uma entrada.
A seguir estão as outras variáveis predefinidas especiais:
- $#: Quantos parâmetros de linha de comando foram passados para o script.
- $@: Todos os parâmetros da linha de comando passados para o script.
- $?: O status de saída do último processo a ser executado.
- $$: O ID do processo (PID) do script atual.
- $ USUÁRIO: O nome de usuário do usuário que está executando o script.
- $ HOSTNAME: O nome do host do computador que está executando o script.
- $ SECONDS: O número de segundos em que o script está sendo executado.
- $ RANDOM: Retorna um número aleatório.
- $ LINENO: Retorna o número da linha atual do script.
Você quer ver todos eles em um script, não é? Você pode! Salve o seguinte como um arquivo de texto chamado,special.sh
:
#! / bin / bash echo "Havia $ # parâmetros de linha de comando" echo "Eles são: $ @" echo "O parâmetro 1 é: $ 1" echo "O script é chamado: $ 0" # qualquer processo antigo para que possamos relatar no status de saída pwd echo "pwd retornou $?" echo "Este script tem ID de processo $$" echo "O script foi iniciado por $ USER" echo "Ele está sendo executado em $ HOSTNAME" sleep 3 echo "Ele está sendo executado por $ SECONDS segundos" echo "Número aleatório: $ RANDOM" echo "Esta é a linha número $ LINENO do script"
Digite o seguinte para torná-lo executável:
chmod + x especial.sh
Agora, você pode executá-lo com vários parâmetros de linha de comando diferentes, conforme mostrado abaixo.
variáveis ambientais
O Bash usa variáveis de ambiente para definir e registrar as propriedades do ambiente que ele cria quando é iniciado. Eles armazenam informações que o Bash pode acessar prontamente, como seu nome de usuário, localidade, o número de comandos que seu arquivo de histórico pode conter, seu editor padrão e muito mais.
Para ver as variáveis de ambiente ativas em sua sessão Bash, use este comando:
env | menos
Se você rolar pela lista, poderá encontrar alguns que seriam úteis para referência em seus scripts.
Como exportar variáveis
Quando um script é executado, ele está em seu próprio processo e as variáveis que ele usa não podem ser vistas fora desse processo. Se você deseja compartilhar uma variável com outro script que o seu script inicia, você deve exportar essa variável. Mostraremos como fazer isso com dois scripts.
Primeiro, salve o seguinte com o nome do arquivoscript_one.sh
:
#! / bin / bash first_var = alpha second_var = bravo # verificar seus valores echo "$ 0: first_var = $ first_var, second_var = $ second_var" export first_var export second_var ./script_two.sh # verificar seus valores novamente echo "$ 0: first_var = $ first_var, second_var = $ second_var "
Isso cria duas variáveis, first_var
e segunda_var
, e atribui alguns valores. Ele os imprime na janela do terminal, exporta as variáveis e chama script_two.sh
. Quando script_two.sh
termina e o fluxo do processo retorna a este script, ele imprime novamente as variáveis na janela do terminal. Então, você pode ver se eles mudaram.
O segundo script que usaremos é script_two.sh
. Este é o script quescript_one.sh
chamadas. Digite o seguinte:
#! / bin / bash # verificar seus valores echo "$ 0: first_var = $ first_var, second_var = $ second_var" # definir novos valores first_var = charlie second_var = delta # verificar seus valores novamente echo "$ 0: first_var = $ first_var, second_var = $ second_var "
Este segundo script imprime os valores das duas variáveis, atribui novos valores a elas e os imprime novamente.
Para executar esses scripts, você deve digitar o seguinte para torná-los executáveis:
chmod + x script_one.sh chmod + x script_two.sh
E agora, digite o seguinte para iniciar script_one.sh
:
./script_one.sh
Isso é o que a saída nos diz:
- script_one.sh imprime os valores das variáveis, que são alfa e bravo.
- script_two.sh imprime os valores das variáveis (alfa e bravo) conforme os recebeu.
- script_two.sh muda-os para charlie e delta.
- script_one.sh imprime os valores das variáveis, que ainda são alfa e bravo.
O que acontece no segundo script, fica no segundo script. É como se cópias das variáveis fossem enviadas para o segundo script, mas elas são descartadas quando o script é encerrado. As variáveis originais no primeiro script não são alteradas por nada que aconteça com as cópias delas no segundo.
Como citar variáveis
Você deve ter notado que quando os scripts fazem referência a variáveis, eles estão entre aspas "
. Isso permite que as variáveis sejam referenciadas corretamente, de forma que seus valores sejam usados quando a linha for executada no script.
Se o valor que você atribui a uma variável inclui espaços, eles devem estar entre aspas ao atribuí-los à variável. Isso ocorre porque, por padrão, o Bash usa um espaço como delimitador.
Aqui está um exemplo:
site_name = How-To Geek
Bash vê o espaço antes de “Geek” como uma indicação de que um novo comando está começando. Ele relata que não existe tal comando e abandona a linha. eco
nos mostra que o nome do site
variável não contém nada - nem mesmo o texto “Como fazer”.
Tente novamente colocando o valor entre aspas, conforme mostrado a seguir:
site_name = "How-To Geek"
Desta vez, é reconhecido como um único valor e atribuído corretamente ao nome do site
variável.
echo é seu amigo
Pode levar algum tempo para se acostumar com a substituição de comandos, citando variáveis e lembrando quando incluir o cifrão.
Antes de apertar Enter e executar uma linha de comandos Bash, experimente com eco
na frente dele. Dessa forma, você pode ter certeza de que o que vai acontecer é o que você deseja. Você também pode detectar quaisquer erros que possa ter cometido na sintaxe.