Variáveis Especiais no Shell

ShellBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá sobre as variáveis especiais em scripts shell. Essas variáveis fornecem informações essenciais sobre o ambiente de execução do script, como argumentos de linha de comando, o nome do script e o ID do processo. Compreender essas variáveis ajudará você a escrever scripts shell mais flexíveis e poderosos.

Criando Seu Primeiro Script

Vamos começar criando um script shell simples para demonstrar o uso de variáveis especiais.

  1. Abra o seu terminal no WebIDE. Você verá um prompt de comando aguardando sua entrada.

  2. Navegue até o diretório do projeto:

cd ~/project

Este comando altera seu diretório atual para ~/project, que é o seu diretório de trabalho padrão para este laboratório.

  1. Crie um novo arquivo chamado special_vars.sh usando o seguinte comando:
touch special_vars.sh

O comando touch cria um arquivo vazio se ele não existir, ou atualiza sua data de modificação caso já exista.

  1. Abra o arquivo no editor do WebIDE. Você pode fazer isso clicando no nome do arquivo no explorador de arquivos no lado esquerdo da tela.

  2. Adicione o seguinte conteúdo ao arquivo:

#!/bin/bash

echo "Script Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"
echo "All Arguments: $@"
echo "Number of Arguments: $#"
echo "Process ID: $$"

Vamos detalhar o que cada linha faz:

  • #!/bin/bash: Isso é chamado de shebang. Ele informa ao sistema para usar o bash para interpretar este script.
  • $0: Esta variável especial armazena o nome do script.
  • $1 e $2: Representam o primeiro e o segundo argumentos da linha de comando, respectivamente.
  • $@: Representa todos os argumentos da linha de comando passados para o script.
  • $#: Fornece a contagem de argumentos da linha de comando.
  • $$: Fornece o ID do processo (PID) do shell atual.
  1. Salve o arquivo após adicionar o conteúdo.

  2. Torne o script executável executando o seguinte comando no seu terminal:

chmod +x special_vars.sh

O comando chmod altera as permissões de um arquivo. A opção +x adiciona permissão de execução, permitindo que você rode o script.

Executando o Script com Argumentos

Agora que criamos nosso script, vamos executá-lo com diferentes argumentos para ver como as variáveis especiais se comportam.

  1. Execute o script sem nenhum argumento:
./special_vars.sh

O ./ antes do nome do script diz ao shell para procurar o script no diretório atual.

Você deve ver uma saída semelhante a esta:

Script Name: ./special_vars.sh
First Argument:
Second Argument:
All Arguments:
Number of Arguments: 0
Process ID: 1234

Observe que o primeiro e o segundo argumentos estão vazios, e o número de argumentos é 0, já que não fornecemos nenhum.

  1. Agora, execute o script com alguns argumentos:
./special_vars.sh hello world

A saída deve ser parecida com esta:

Script Name: ./special_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Process ID: 1235

Aqui está o que mudou:

  • $1 agora contém "hello"
  • $2 agora contém "world"
  • $@ mostra todos os argumentos: "hello world"
  • $# mostra 2, porque fornecemos dois argumentos

O ID do Processo ($$) pode ser diferente cada vez que você executa o script, pois é atribuído pelo sistema operacional.

Entendendo $? e $!

Duas outras variáveis especiais importantes são $? e $!. Vamos criar um novo script para demonstrar o uso delas.

  1. Crie um novo arquivo chamado exit_status.sh:
touch ~/project/exit_status.sh
  1. Abra o arquivo no editor do WebIDE e adicione o seguinte conteúdo:
#!/bin/bash

echo "Running a successful command:"
ls /home
echo "Exit status: $?"

echo "Running a command that will fail:"
ls /nonexistent_directory
echo "Exit status: $?"

echo "Running a background process:"
sleep 2 &
echo "Process ID of last background command: $!"

Vamos analisar este script:

  • $? fornece o status de saída do último comando executado. 0 normalmente significa sucesso, enquanto valores diferentes de zero indicam várias condições de erro.
  • $! fornece o ID do processo do último comando executado em segundo plano (background).
  • O & ao final de um comando faz com que ele seja executado em segundo plano.
  1. Salve o arquivo e torne-o executável:
chmod +x ~/project/exit_status.sh
  1. Execute o script:
./exit_status.sh

Você deve ver uma saída semelhante a esta:

Running a successful command:
labex
Exit status: 0
Running a command that will fail:
ls: cannot access '/nonexistent_directory': No such file or directory
Exit status: 2
Running a background process:
Process ID of last background command: 1236

Observe:

  • O primeiro comando ls é bem-sucedido, então $? é 0.
  • O segundo comando ls falha (porque o diretório não existe), então $? é 2 (um valor diferente de zero indicando um erro).
  • O comando sleep roda em segundo plano, e $! fornece seu ID de processo.

Usando Variáveis Especiais em Funções

Variáveis especiais também podem ser usadas dentro de funções. Vamos criar um script para demonstrar isso.

  1. Crie um novo arquivo chamado function_vars.sh:
touch ~/project/function_vars.sh
  1. Abra o arquivo no editor do WebIDE e adicione o seguinte conteúdo:
#!/bin/bash

function print_args {
  echo "Function Name: $0"
  echo "First Argument: $1"
  echo "Second Argument: $2"
  echo "All Arguments: $@"
  echo "Number of Arguments: $#"
}

echo "Calling function with two arguments:"
print_args hello world

echo "Calling function with four arguments:"
print_args one two three four

Este script define uma função print_args que utiliza variáveis especiais. Em seguida, chama essa função duas vezes com diferentes números de argumentos.

  1. Salve o arquivo e torne-o executável:
chmod +x ~/project/function_vars.sh
  1. Execute o script:
./function_vars.sh

Você deve ver uma saída semelhante a esta:

Calling function with two arguments:
Function Name: ./function_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Calling function with four arguments:
Function Name: ./function_vars.sh
First Argument: one
Second Argument: two
All Arguments: one two three four
Number of Arguments: 4

Note que:

  • $0 ainda se refere ao nome do script, não ao nome da função.
  • $1, $2, $@ e $# funcionam para os argumentos da função da mesma forma que funcionam para os argumentos do script.
  • Os valores dessas variáveis mudam cada vez que a função é chamada com argumentos diferentes.

Entendendo a Diferença Entre $@ e $*

As variáveis especiais $@ e $* são ambas usadas para representar todos os argumentos da linha de comando, mas se comportam de maneira diferente quando colocadas entre aspas duplas. Vamos criar um script para demonstrar essa diferença.

  1. Crie um novo arquivo chamado at_vs_star.sh:
touch ~/project/at_vs_star.sh
  1. Abra o arquivo no editor do WebIDE e adicione o seguinte conteúdo:
#!/bin/bash

echo "Using \$@:"
for arg in "$@"; do
  echo "Argument: $arg"
done

echo "Using \$*:"
for arg in "$*"; do
  echo "Argument: $arg"
done

Este script demonstra a diferença entre $@ e $* quando usados em um loop.

  1. Salve o arquivo e torne-o executável:
chmod +x ~/project/at_vs_star.sh
  1. Execute o script com múltiplos argumentos, incluindo alguns com espaços:
./at_vs_star.sh "arg with spaces" another_arg "third arg"

Você deve ver uma saída semelhante a esta:

Using $@:
Argument: arg with spaces
Argument: another_arg
Argument: third arg
Using $*:
Argument: arg with spaces another_arg third arg

Aqui está o que está acontecendo:

  • Com "$@", cada argumento é tratado como uma entidade separada. Argumentos com espaços são preservados como unidades únicas.
  • Com "$*", todos os argumentos são combinados em uma única string, separados pelo primeiro caractere da variável IFS (Internal Field Separator), que geralmente é um espaço.

Essa diferença é crucial quando você precisa processar argumentos que podem conter espaços ou outros caracteres especiais.

Resumo

Neste laboratório, você aprendeu sobre as variáveis especiais em scripts shell e como usá-las de forma eficaz. Você criou scripts que demonstram o uso de várias variáveis especiais, como $0, $1, $@, $#, $$, $? e $!. Você também explorou como essas variáveis se comportam em diferentes contextos, inclusive dentro de funções e ao lidar com argumentos de linha de comando.

Principais aprendizados:

  1. $0, $1, $2, etc., representam o nome do script e os argumentos da linha de comando.
  2. $@ e $# permitem que você trabalhe com todos os argumentos e os conte.
  3. $$ fornece o ID do processo atual, útil para criar arquivos temporários exclusivos.
  4. $? ajuda você a verificar se o comando anterior foi bem-sucedido.
  5. $! fornece o PID do último processo em segundo plano, útil para controle de jobs.
  6. $@ e $* se comportam de maneira diferente quando entre aspas, o que é importante ao lidar com argumentos que contêm espaços.

Compreender essas variáveis especiais é fundamental para escrever scripts shell mais avançados e flexíveis. Elas permitem criar scripts que se adaptam a diferentes entradas e fornecem informações valiosas sobre o ambiente de execução do script.

À medida que você continuar a praticar e experimentar com scripts shell, encontrará muito mais maneiras de aproveitar essas variáveis especiais em seu trabalho. Lembre-se de consultar o manual do bash (man bash) para obter informações mais detalhadas sobre estas e outras variáveis especiais.