
De acordo comesta postagem, [
é um recurso interno e [[
é uma palavra-chave. Como podem ser considerados como comandos, tudo o que vem depois de [
e [[
é considerado como argumento de comando e deve ser separado por espaços, até que encontre o argumento final ]
e]]
Mas qual é o tipo de ((
?
type ((
dará um erro:
bash: syntax error near unexpected token `('.
Descobri que espaços não são relevantes dentro de (( ))
.
echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+ 1))
echo $(( 1 + 1 ))
são todos iguais
resumo
de acordo comDocumento padrão POSIX: seção Comandos de agrupamento
Se uma sequência de caracteres começando com "((" fosse analisada pelo shell como uma expansão aritmética se precedida por um '$', shells que implementam uma extensão pela qual "((expressão))" é avaliada como uma expressão aritmética podem tratar o "((" como introdução como uma avaliação aritmética em vez de um comando de agrupamento. Um aplicativo em conformidade deve garantir que separa os dois caracteres iniciais '(' com espaço em branco para evitar que o shell execute uma avaliação aritmética.
E a avaliação aritmética interna ((...))
está em conformidade com o estilo C. Então o espaço não é relevante dentro((...))
Responder1
((
não é uma palavra. Ao contrário de [
e [[
, não faz parte da lista de palavras que constitui um comando. A melhor maneira de pensar nisso é como pontuação. Na verdade, são dois caracteres de pontuação, que podem ou não ser combinados em um único token dependendo do contexto. É semelhante a coisas como >&
e ||
nesse aspecto. Os caracteres de pontuação são tratados de forma ad-hoc pelo lexer/analisador do shell.
((
é metade de um operador, sendo a outra metade ))
. Juntos eles formam o operador de expressão aritmética, que possui uma sintaxe “outfix”. A estrutura gramatical das linguagens shell, como o bash, não segue muito bem a sintaxe da linguagem de programação tradicional (por exemplo, existem laços muito fortes entre a análise lexical e a análise gramatical, porque os caracteres de pontuação têm um significado que depende do contexto gramatical), então não nem sempre são palavras bem ajustadas.
type
só pode fornecer informações sobre palavras que podem aparecer em comandos simples e sobre palavras-chave, não sobre como funciona o lexer/analisador do shell.