Devemos colocar nomes de arquivos no Bash entre aspas ou aspas duplas? Qual é o padrão?
SRC=file
ou
SRC='file'
ou
SRC="file"
?
Devemos colocar nomes de arquivos no Bash entre aspas ou aspas duplas? Qual é o padrão?
SRC=file
ou
SRC='file'
ou
SRC="file"
?
Uma coisa a se notar sobre atribuições de variáveis é que elas são um caso especial na sintaxe do shell. Na documentação do Bash, em 3.7.1 Simple Command Expansion :
Em geral, entretanto, os tokens também passam por divisão de campo e expansão de nome de arquivo (consulte 3.5 Expansões de Shell ), mas isso não é executado durante a atribuição de variáveis .
Isso significa que um não citado
$foo
é tratado de forma diferente nos seguintes casos:Digamos
foo='/* a b c */'
. (* a b c *
é um nome perfeitamente válido para um diretório, portanto/* a b c */
é um caminho perfeitamente válido para um diretório.) Parasome-command $foo
, primeiro é como se você tivesse escrito:E então é expandido pelo shell para algo como:
Mas para
bar=$foo
, esse não é o caso. Nem a divisão de campo nem a expansão do nome do arquivo serão feitas e permanecerão como estão -bar
terão o valor/* a b c */
. No entanto, se você fizer issosome-other-command $bar
, ele fará a divisão de campos e a expansão do nome do arquivo.Em ambos os casos, porém, um quoted
"$foo"
terá o mesmo comportamento:Algumas regras práticas:
Se o seu valor tiver metacaracteres de shell, você terá que citar pelo menos esses metacaracteres. Um metacaractere é:
Se o valor tiver
!
, e a expansão do histórico estiver habilitada (o que geralmente é o caso em shells interativos), você precisará citar pelo menos o!
usando aspas simples ou uma barra invertida . Aspas duplas não são suficientes.Se o valor tiver a
~
e você quiser que a expansão do til aconteça, então "til-prefix" deverá estar sem aspas (então~/
in"/some/path":~/"bar"
, ou~user/
in~user/".config/app"
, etc.). Isso torna possível misturar a expansão do til com caminhos contendo espaços e coisas assim (so~user/"some path (with metacharacters)"
).Se o valor tiver expansões de parâmetros (
$foo
,${foo}
, etc.), ou substituições de comandos ($(bar)
, ou`foo`
), ou expansões aritméticas ($((a+b))
), ou algo parecido com isso, então:$
in$(
, pois(
é um metacaractere mencionado acima e também precisa ser citado.Se o valor contiver substituições de processo (
>(...)
ou<(...)
), isso só será executado se a substituição não estiver entre aspas.Matrizes são um jogo diferente da atribuição normal. Em geral, a parte interna
(...)
de fora=(...)
é expandida exatamente como seria em qualquer outro lugar na linha de comando, portanto, a divisão de campo e a expansão do nome do arquivo são executadas. Isso torna possível fazer algo como:E obtenha entradas
$PATH
como itens individuais no arraypath
.Sem exemplo de citações:
Isso irá ecoar Documents .
Tudo após o primeiro espaço será perdido. Você precisa das aspas para reter os espaços. Não usar aspas funcionará apenas para palavras isoladas, mas não é considerado uma boa prática em geral. É melhor usar aspas de qualquer maneira.
Exemplo de aspas duplas:
Isso irá ecoar /home/nomedeusuário/Documentos
Exemplo de aspas simples:
Isso irá ecoar $HOME/Documents
Se você quiser que o sistema use os caracteres como estão, use aspas simples.
Se desejar que o sistema processe variáveis ou outros usos especiais, use aspas duplas.
Não existe um "padrão" de acordo com o Manual de Referência do Bash .
Variáveis (parâmetros do Shell) :
Citando :
Em sistemas de servidor, os nomes de arquivos padrão geralmente serão caracteres alfanuméricos padrão, não contendo nenhum caractere especial, e aspas geralmente não serão necessárias (embora possam ser aplicadas exceções).
No entanto, em sistemas desktop, é mais comum que nomes de arquivos contenham espaços e outros caracteres especiais, e então o caminho deve ser colocado entre aspas - e isso geralmente é considerado a "rota segura".
Se estiver citando, use as aspas que atendem às suas necessidades: as aspas simples tratarão cada caractere literalmente, enquanto as aspas duplas ainda tratarão
$
, e como especiais.`
\
!
Mas os critérios para cotação são separados para a sintaxe de atribuição de variáveis, portanto depende inteiramente do contexto da variável (neste caso, o nome do arquivo).