Visão Geral
Muitos administradores e desenvolvedores consideram o colchete de abertura [ apenas um elemento sintático em scripts Bash. No entanto, no ecossistema Unix/Linux, ele opera como um executável independente com funcionalidade equivalente ao utilitário test. Neste guia, exploraremos a real natureza desse comando, como o interpretador processa suas instruções e a maneira correta de avaliar sua resposta por meio da variável de status de término ($?).
1. Revelando a Identidade de ‘[’ e Localizando o Executável no Sistema
Para verificar se o caractere [ possui um executável correspondente armazenado no disco, consultamos o caminho do binário através de which [:
which [
O terminal retorna a localização /usr/bin/[. Esse retorno evidencia que o colchete não é mera marcação gramatical da linguagem de script, mas sim uma ferramenta autônoma presente no sistema operacional.
⚙️ [Parâmetros Essenciais de Avaliação]
-f : Avalia se o destino informado é um arquivo regular.-d : Checa se a referência fornecida corresponde a um diretório.-e : Valida a existência física do arquivo ou pasta informada.-z : Confirma se o comprimento do texto avaliado é igual a zero (cadeia vazia).-n : Certifica que a cadeia de caracteres possui conteúdo (tamanho maior que zero).= : Examina a igualdade literal entre duas strings.-eq : Confere se dois números inteiros são equivalentes.-ne : Verifica se existe discrepância numérica entre dois inteiros.

Para entender a ordem de prioridade na execução do comando dentro da sessão atual do interpretador, inspecionamos com type -a [:
type -a [
O diagnóstico aponta que o interpretador prioriza a implementação embutida na memória (shell builtin), mantendo concomitantemente os binários físicos compilados em /usr/bin/[ e /bin/[ acessíveis no sistema de arquivos.

Investigamos as propriedades do arquivo binário e seus atributos de segurança emitindo ls -l /usr/bin/[:
ls -l /usr/bin/[
A listagem confirma que o arquivo possui atributos de execução normais (-rwxr-xr-x), consistindo em um utilitário ELF perfeitamente funcional instalado no disco.

2. Sintaxe Prática e Interpretação do Status de Saída ($?)
Iniciamos uma comparação lógica simples testando se o valor dez supera cinco por meio de [ 10 -gt 5 ]:
[ 10 -gt 5 ]
Operações conduzidas por [ trabalham de modo silencioso: nenhum texto é enviado para a saída padrão (stdout), sendo o resultado transmitido exclusivamente via código de retorno.

Para ler a resposta processada pelo comando anterior, inspecionamos o valor especial do ambiente com echo $?:
echo $?
O terminal devolve 0. No padrão POSIX e na filosofia Unix, o valor zero reflete sucesso absoluto na operação, confirmando que a condição avaliada é verdadeira (True).

Em contrapartida, submetemos uma afirmação logicamente incorreta via [ 10 -lt 5 ], testando se dez seria menor que cinco:
[ 10 -lt 5 ]
Da mesma forma, a execução ocorre sem produzir saída textual direta, delegando o resultado da avaliação ao registro interno de término.

Ao emitirmos novamente echo $?, capturamos o novo estado de finalização gerado:
echo $?
O sistema apresenta um código diferente de zero (geralmente 1), sinalizando formalmente que a validação falhou (condição falsa).

3. Validação Prática de Arquivos e Diretórios (-f, -d, -s)
Estruturamos um ambiente temporário isolado para demonstrar os testes de sistema de arquivos executando mkdir -p /tmp/bracket_test && touch /tmp/bracket_test/sample.txt:
mkdir -p /tmp/bracket_test && touch /tmp/bracket_test/sample.txt

Validamos a presença física de um arquivo comum combinando a diretiva com o operador lógico de curto-circuito: [ -f /tmp/bracket_test/sample.txt ] && echo "파일이 정상적으로 존재합니다":
[ -f /tmp/bracket_test/sample.txt ] && echo "파일이 정상적으로 존재합니다"
Como o caminho aponta para um arquivo existente e válido, o status de sucesso aciona a cláusula subsequente definida pelo operador &&.

Verificamos agora a integridade estrutural do diretório alvo por meio da instrução [ -d /tmp/bracket_test ] && echo "디렉터리가 맞습니다":
[ -d /tmp/bracket_test ] && echo "디렉터리가 맞습니다"
A validação confirma que o alvo trata-se de um diretório legítimo, emitindo o texto afirmativo configurado.

Testamos o dimensionamento do arquivo usando a opção -s, que avalia se o arquivo contém dados superiores a zero bytes: [ -s /tmp/bracket_test/sample.txt ] || echo "파일 크기가 0(비어있음)입니다":
[ -s /tmp/bracket_test/sample.txt ] || echo "파일 크기가 0(비어있음)입니다"
Como o arquivo criado pelo comando touch está completamente vazio, o teste devolve uma falha (código 1), provocando o disparo da mensagem alternativa atrelada ao operador lógico ||.

4. Integração Profissional com Estruturas Condicionais (if)
Para exemplificar a tomada de decisão em rotinas de automação, gravamos uma linha de texto no arquivo recém-criado com echo "Ubuntu Shell Test" > /tmp/bracket_test/sample.txt:
echo "Ubuntu Shell Test" > /tmp/bracket_test/sample.txt

Empregamos a clássica estrutura condicional if associada ao comando [ para checar se há dados válidos antes da leitura: if [ -s /tmp/bracket_test/sample.txt ]; then echo "내용 확인: $(cat /tmp/bracket_test/sample.txt)"; fi:
if [ -s /tmp/bracket_test/sample.txt ]; then echo "내용 확인: $(cat /tmp/bracket_test/sample.txt)"; fi
O arquivo agora possui bytes armazenados, tornando o teste -s verdadeiro. Isso autoriza o fluxo a entrar no bloco then, imprimindo com segurança a informação registrada.

Ao término do laboratório, higienizamos o diretório temporário para evitar resíduos no sistema executando rm -rf /tmp/bracket_test:
rm -rf /tmp/bracket_test

Compreender que o caractere [ se comporta como um executável concreto — e não apenas como um delimitador visual — transforma a forma como escrevemos e depuramos scripts no Linux. Esse conhecimento evita falhas comuns de espaçamento e permite manipular os códigos de saída ($?) com muito mais precisão e robustez no ambiente de produção.