Comentários
Resposta
Os colchetes são uma notação abreviada para realizar um teste condicional. Os colchetes [
, bem como [[
são comandos reais do Unix, acredite ou não.
Pense:
$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file
No Bash, o [
é um comando embutido, bem como um executável. [[
é apenas uma palavra-chave para o Bash.
Exemplo
Você pode confirmar isso usando type
:
$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword
Você pode ver o executável físico aqui:
$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
builtins vs . keywords
Se você der uma olhada na página do manual do Bash, man bash
, você encontrará as seguintes definições para o 2:
-
palavras-chave – palavras reservadas são palavras que têm um significado especial para o shell. As seguintes palavras são reconhecida como reservada quando não citada e a primeira palavra de um comando simples (consulte SHELL GRAMMAR abaixo) ou a terceira palavra de um caso ou de comando:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins – Se o nome do comando não contiver barras, o shell tentará localizá-lo. existe uma função shell com esse nome, essa função é invocada conforme descrito acima em F UNCTIONS. Se o nome não corresponder a uma função, o shell procura por ele na lista de comandos internos do shell. Se uma correspondência for encontrada, esse embutido é invocado.
Se o nome não for uma função shell nem um embutido e não contiver barras, o bash procura em cada elemento do PATH por um diretório contendo um arquivo executável por aquele nome. O Bash usa uma tabela de hash para lembrar os nomes de caminho completos dos arquivos executáveis (consulte o hash em COMANDOS DE CONSTRUÇÃO DE SHELL abaixo). Uma pesquisa completa dos diretórios em PATH é realizada apenas se o comando não for encontrado na tabela de hash. Se a pesquisa não for bem-sucedida, o shell procura por uma função de shell definida chamada command_not_found_handle. Se essa função existir, ela é chamada com o comando original e os argumentos do comando original como seus argumentos, e o status de saída da função torna-se o status de saída do shell. Se essa função não for definida, o shell imprime uma mensagem de erro e retorna um status de saída de 127.
página do manual
Se você olhar através do Na página do manual do Bash, você encontrará os detalhes nela.
test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
Por último, na página do manual:
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
EDITAR # 1
Pergunta de acompanhamento do OP.
Ok, então por que existe um precisa de um “se” então? Quero dizer, por que “se” ainda existe se “[” seria suficiente.
O if
é parte de uma condicional. O comando test
ou [ ... ]
simplesmente avalia a condicional e retorna 0 ou a 1. O 0 ou 1 é então acionado pela instrução if. Os 2 estão trabalhando juntos quando você os usa.
Exemplo
if [ ... ]; then ... do this ... else ... do that ... fi
Comentários
- Ok, então por que há uma necessidade de " if " então? Eu eu an, por que " se " ainda existe se " [" seria suficiente.
- Pequenos detalhes:
[[
também pode ser um shell embutido. - @supertonsky – eles funcionam mas eles apenas retornam o status do teste, eles podem ' t agir sobre ele de qualquer maneira. O
if
atua como um switch e executa os comandos no blocothen
, dependendo dos resultados retornados pela condicional.if
isn ' t realmente opcional na maneira como você ' repensa, os exemplos que mostrou o uso&&
que é parecido com oif
. Se a condicional falhar, o comando após&&
não será ' executado. - @SteveKoch – como eu entenda isso, o
]
é um argumento neste contexto para o comando[
.Eu ' suponho que sim, mas não consigo ' pensar em nenhum de cabeça. Pode valer a pena postá-lo como outro Q se você ' estiver realmente curioso. - @SteveKoch – aliás,
/usr/bin/[
mostra como parte do coreutils no meu sistema Fedora. Você sempre pode consultar a fonte sobre esses assuntos se quiser saber exatamente como essas coisas funcionam. git.savannah.gnu.org/cgit/coreutils.git
Resposta
Ooohh, um dos meus tópicos favoritos !!
Colchetes são um sinônimo para o comando “test”. Se você ler a página de manual de teste, “verá que pode invocar o comando de teste como
test -r /etc/profile.d/java.sh
ou
[ -r /etc/profile.d/java.sh ]
Os espaços entre os colchetes e o material dentro e fora deles são obrigatórios.
O comando” teste “neste caso está verificando se o arquivo / etc / profile.d / java.sh pode ser lido pelo usuário atual. Está implícito uma verificação para ver se existe, é claro. 🙂
O &&
é um atalho de sintaxe bash para “se o comando à esquerda for bem-sucedido, execute o comando à direita. Portanto, este comando composto é uma abreviação para um “se-então” que se pareceria com isto:
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
Agora, você também encontrará colchetes duplos explicado na página de manual do bash. Essas são uma versão interna do bash de uma função de teste estendida. Esteja ciente de que não são exatamente iguais. Há coisas que você pode fazer com aquelas que você não pode fazer com o comando “test” e seu ” [“sinônimo.
Comentários
- Só quero ter certeza de que entendi. Se colchetes forem um apelido para " teste ", deve ' seu segundo exemplo ser " [- r /etc/profile.d/java.sh] "? Em outras palavras, remova a declaração de teste redundante.
- Sim, pmont, você ' está exatamente certo, é claro! Não fui ' tão cuidadoso ao cortar e colar. Eu ' consertamos. Obrigado!
if
. Esta pergunta pergunta o que os colchetes significam sem umaif
declaração.