Estou dividido entre saber se isso é uma implementação deficiente ou uma documentação deficiente. Bash diz isso sobre remoção de cotações:
Quote Removal
After the preceding expansions, all unquoted occurrences of the characters
\
,'
, and"
that did not result from one of the above expansions are removed.
Acho que a chave pode ser "todas as ocorrências não citadas " nesse parágrafo. Tudo dentro de $(( ))
é tratado como se estivesse entre aspas duplas, de acordo com a documentação. Esses personagens são todos citados se estiverem dentro dos parênteses, fazendo com que a remoção das citações seja essencialmente um noop. Por exemplo, observe como os outros caracteres "removidos" são tratados (observe também como o espaço à direita é preservado, devido à maneira como as cadeias de caracteres citadas são analisadas):
$ echo $(( '5' ))
bash: '5' : syntax error: operand expected (error token is "'5' ")
$ echo $(( \ ))
bash: \ : syntax error: operand expected (error token is "\ ")
Percorrendo o código-fonte, as cotações precisam ser balanceadas, como resultado do código que procura para identificar se $(( ))
é matemática ou uma subexpressão legada aninhada. Quando a string é identificada como uma expressão aritmética, ela é então analisada como se fosse duplicada - o que significa todos os caracteres que são considerados antes da remoção da cotação.
Pessoalmente, isso é parte do porque eu prefiro o ksh - especialmente para matemática. Ele trata o single-citado 5 acima como uma string C que é avaliada como 53, por exemplo. man ascii
para ver porque isso faz sentido. :)