AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1493236
Accepted
fsgdfgdfgd
fsgdfgdfgd
Asked: 2023-11-20 02:44:57 +0800 CST2023-11-20 02:44:57 +0800 CST 2023-11-20 02:44:57 +0800 CST

Devemos colocar nomes de arquivos no Bash entre aspas ou aspas duplas? Qual é o padrão?

  • 772

Devemos colocar nomes de arquivos no Bash entre aspas ou aspas duplas? Qual é o padrão?

SRC=file

ou

SRC='file'

ou

SRC="file"

?

bash
  • 3 3 respostas
  • 997 Views

3 respostas

  • Voted
  1. muru
    2023-11-20T14:06:35+08:002023-11-20T14:06:35+08:00

    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 :

    O texto após o ' =' em cada atribuição de variável sofre expansão de til, expansão de parâmetro, substituição de comando, expansão aritmética e remoção de aspas antes de ser atribuído à variável.

    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:

    some-command $foo
    bar=$foo
    

    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.) Para some-command $foo, primeiro é como se você tivesse escrito:

    some-command /* a b c */
    

    E então é expandido pelo shell para algo como:

    some-command /bin /boot ... a b c dir1/ dir2/ ...
    

    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 - barterão o valor /* a b c */. No entanto, se você fizer isso some-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:

    some-command "$foo" # no field splitting, no filename expansion
    bar="$foo"          # equivalent to bar=$foo
    

    Algumas regras práticas:

    1. Se o seu valor tiver metacaracteres de shell, você terá que citar pelo menos esses metacaracteres. Um metacaractere é:

      Um caractere que, quando não citado, separa palavras. Um metacaractere é um space, tab, newlineou um dos seguintes caracteres: ' |', ' &', ' ;', ' (', ' )', '' <, '' ou ' >'.

    2. 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.

    3. 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)").

    4. 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:

      1. Cite-os com aspas simples se não quiser que as expansões sejam realizadas. Você também pode usar barra invertida, mas não é suficiente escapar apenas $in $(, pois (é um metacaractere mencionado acima e também precisa ser citado.
      2. Não citá-los é bom se você quiser expandi-los ou pode usar aspas duplas.
    5. 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 for a=(...)é 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:

    set -f
    IFS=:
    path=($PATH)
    

    E obtenha entradas $PATHcomo itens individuais no array path.

    • 7
  2. Stormlord
    2023-11-20T08:16:19+08:002023-11-20T08:16:19+08:00

    Sem exemplo de citações:

    filePath=Documents Folder 2
    echo "$filePath"
    

    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:

    filePath="$HOME/Documents"
    echo "$filePath"
    

    Isso irá ecoar /home/nomedeusuário/Documentos

    Exemplo de aspas simples:

    filePath='$HOME/Documents'
    echo "$filePath" 
    

    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.

    • 5
  3. Best Answer
    Artur Meinild
    2023-11-20T02:59:30+08:002023-11-20T02:59:30+08:00

    Não existe um "padrão" de acordo com o Manual de Referência do Bash .

    Variáveis ​​(parâmetros do Shell) :

    Uma variável pode ser atribuída por uma instrução da forma

    name=[value]
    

    Citando :

    A citação é usada para remover o significado especial de certos caracteres ou palavras do shell. As aspas podem ser usadas para desabilitar o tratamento especial para caracteres especiais, para evitar que palavras reservadas sejam reconhecidas como tal e para evitar a expansão de parâmetros.

    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).

    • 4

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve