
De acuerdo aesta publicación, [
es una función incorporada y [[
es una palabra clave. Dado que pueden considerarse como comando, todo lo que sigue a [
y [[
se considera argumentos de comando y debe estar separado por espacios, hasta que se encuentre con el argumento final ]
y]]
¿Pero cuál es el tipo de ((
?
type ((
dará un error:
bash: syntax error near unexpected token `('.
Descubrí que los espacios no son relevantes en el interior (( ))
.
echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+ 1))
echo $(( 1 + 1 ))
son todos iguales
resumen
de acuerdo aDocumento estándar POSIX: sección Comandos de agrupación
Si el shell analiza una secuencia de caracteres que comienza con "((" como una expansión aritmética si está precedida por un '$', los shells que implementan una extensión mediante la cual "((expresión))" se evalúa como una expresión aritmética pueden tratar la "((" se introduce como una evaluación aritmética en lugar de un comando de agrupación. Una aplicación conforme debe asegurarse de separar los dos caracteres '(' iniciales con espacios en blanco para evitar que el shell realice una evaluación aritmética.
Y la evaluación aritmética interna ((...))
se ajusta al estilo C. Entonces el espacio no es relevante en el interior.((...))
Respuesta1
((
no es una palabra. A diferencia de [
y [[
, no forma parte de la lista de palabras que constituye un comando. La mejor forma de verlo es como puntuación. En realidad, se trata de dos caracteres de puntuación, que pueden combinarse o no en un solo token según el contexto. Es similar a cosas como >&
y ||
en ese sentido. Los caracteres de puntuación son tratados de forma ad hoc por el lexer/analizador del shell.
((
es la mitad de un operador y la otra mitad es ))
. Juntos forman el operador de expresión aritmética, que tiene una sintaxis de "fijo". La estructura gramatical de los lenguajes shell como bash no sigue muy claramente la sintaxis de los lenguajes de programación tradicionales (por ejemplo, existen vínculos muy fuertes entre el análisis léxico y el análisis gramatical, porque los caracteres de puntuación tienen un significado que depende del contexto gramatical), por lo que no no siempre son palabras que encajen perfectamente.
type
sólo puede brindarle información sobre palabras que pueden aparecer en comandos simples y sobre palabras clave, no sobre cómo funciona el analizador/lexer del shell.