Ecoando uma string no bash com colchetes em torno dela retorna 'b' [duplicate]

10
$ a='"apple","ball","cat"'
$ a='['$a
$ echo $a
["apple","ball","cat"
$ a=$a']'
$ echo $a
b

Estou com dificuldades pelo resultado b , enquanto espero ver ["apple,"ball","cat"] . O que estou perdendo aqui?

Isso é de bash shell no Mac. Veja também no CentOS 7, enquanto não no Fedora. Alguém pode por favor explicar?

    
por Coder321 14.11.2017 / 23:03

2 respostas

27

Existe um arquivo com o nome b no diretório atual.

[...]

é uma expressão de correspondência de padrões. Ele corresponde a todos os arquivos cujo nome consiste em uma única letra entre [ e ] .

Isso é semelhante a ter * em um valor de variável e usar a variável sem aspas.

    
por 15.11.2017 / 00:29
3

Hauke já respondeu por que isso está acontecendo. Para referência futura, você também pode solucionar o que está acontecendo com strace :

$ touch a b l
$ a='["apple","ball"]'                                                      
$ strace -e trace=execve echo $a
execve("/bin/echo", ["echo", "a", "b", "l"], [/* 82 vars */]) = 0
a b l
+++ exited with 0 +++

Ou com set -x :

$ set -x; echo $a
+ set -x
+ echo a b l
a b l

Pode não ser imediatamente claro, mas pelo menos você vê que o shell converteu a variável sem aspas em uma lista de itens; de lá, podemos deduzir que a expansão do nome do arquivo ocorreu.

    
por 15.11.2017 / 09:20

Tags