Eu notei esse comportamento surpreendente e não consigo entender o que está acontecendo:
$ bash -c 'echo [-1]'
1
$ zsh -c 'echo [-1]'
1
Parece que o analisador de comandos tenta avaliar uma expressão:
$ echo [1,2,3]
1
$ echo [123-33]
1
Porque se a expressão estiver entre aspas ou indicar que um colchete é apenas um colchete, a avaliação estranha será omitida.
$ echo \[123-33]
[123-33]
$ echo [123-33\]
[123-33]
$ echo '[123-33]'
[123-33]
Enquanto procurava por pistas, encontrei esta citação:
Ressalvas
Ao indexar matrizes associativas Bash, sempre use aspas. Caso contrário, o analisador estático terá que assumir que o índice é uma expressão aritmética.
$ echo '${array[spaced string]}' | shfmt 1:16: not a valid arithmetic operator: string $ echo '${array[dash-string]}' | shfmt ${array[dash - string]}
Não tenho certeza do que fazer com isso, porque não há matriz para falar no contexto deecho [1-1]
É claro que isso pode ser causado por algo em meu próprio ambiente, mas quando eu verifico, não parece ser:
$ env -i HOME=$(mktemp -d) bash --noprofile --norc
bash-5.1$ echo [1-1]
1
$ env -i HOME=$(mktemp -d) /bin/bash-4.4 --noprofile --norc
bash-4.4-4.4$ echo [1-1]
1
Mas, novamente, em uma caixa ubuntu, obtenho um resultado diferente:
$ bash --version | sed 1q; echo [1-1]
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
[1-1]
Desativar todas as opções não altera esse comportamento.
for i in `shopt | awk '/on$/ { print $1}'`; do shopt -u $i;done
Você tem alguma ideia do que está fazendo com que essa expressão de colchetes seja avaliada e por que o resultado é 1?