O seguinte roteiro:
$ cat runme01.sh
#!/bin/bash
A=myval
B=$A/{fix}
C=$A/fix
set -xT
echo $B
echo $C
imprime o seguinte se executado:
$ ./runme01.sh
+ echo 'myval/{fix}'
myval/{fix}
+ echo myval/fix
myval/fix
Como você vê, B
a variável é passada echo
entre aspas simples, enquanto a variável C
é passada sem elas.
Provavelmente as chaves causam isso.
Eu gostaria de passá-los sem aspas sempre. Como fazer isso?
Nunca tente interpretar a saída de rastreamento como algo que não seja puramente informativo. É a saída de depuração.
O fato de mostrar as chaves entre aspas simples não significa muito além de que o shell interpretou essa string específica
myval/{fix}
e nada mais. Em particular, isso não significa que a string foi passada entre aspas! O shell adiciona as aspas simples na saída de rastreamento porque as chaves às vezes são especiais, no entanto, nesse caso não são (porque você nunca usa uma expansão de chave real).O mesmo acontece aqui (executando em um diretório vazio):
Não há citação do
*
no meu comando, então o shell tentará expandi-lo. Ele não se expande para nada, então permanece não expandido. O código que produz a saída de rastreamento percebe que há um*
em uma string e o cita. É uma adição mecânica de aspas simples com base em quais caracteres estão presentes na string que é impressa pelo rastreamento, não afeta o comando ou seu resultado de forma alguma.Para ilustrar novamente:
Ou seja, certos caracteres em uma string farão com que o código que produz a saída de rastreamento adicione aspas em torno dessa string em
bash
. O shell também escapa de aspas simples em strings.Compare isso com
dash
oupdksh
:Esses shells específicos não adicionam as aspas (ou escapam de aspas simples). Realmente não importa, é apenas a saída de depuração.
Sempre expansões de variáveis com aspas duplas, a menos que você queira explicitamente que o shell execute a divisão de palavras e a geração de nome de arquivo (globbing) nas strings.
Aspas duplas nem sempre são necessárias , mas é mais fácil lembrar de sempre usar aspas duplas do que memorizar os contextos em que você não precisa.
Seu script, corrigido:
Isso garantirá que você sempre obterá os valores
$B
e$C
imprimirá na saída padrão, independentemente de seus valores. Em seu código original, se$A
tivesse sido*
, using$B
e$C
unquoted pode ter puxado alguns nomes de arquivos correspondentes.Observe que a saída de rastreamento ainda fará a citação da
myval/{fix}
string com este código. Não se preocupe, isso não significa nada, é apenas o shell tentando ser útil com sua saída de depuração.Relacionado: