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 / unix / Perguntas / 441690
Accepted
codeforester
codeforester
Asked: 2018-05-04 17:42:16 +0800 CST2018-05-04 17:42:16 +0800 CST 2018-05-04 17:42:16 +0800 CST

Quais são os contextos em que o Bash não realiza divisão de palavras e globbing?

  • 772

Bash não executa divisão de palavras em globbing nestes casos:

  • LHS ou RHS de uma atribuição, exceto para matrizes indexadas
    var=$value                                # simple variable
    declare -A hash
    key="key with a space"
    hash[$key]=$value                         # index of an associative array
    
    arr=$(echo "1 2 3")                       # word splitting does happen here
    
  • Lado de dentro[[ ]]
    var="one two"
    if [[ $var = *" "* ]]; then ...           # check if var has a space in it
    if [[ $(echo "one two") = $var ]]; then   # use the output of command substitution to compare with var
    
  • Lado de dentro(( ))
    ((sum = $(echo "99 + 1")))                  # assigns 100 to sum
    
  • Em herestring
    cat <<< *                                 # gives '*' as the output
    

Existe uma lista definitiva de casos em que o Bash executa ou não a divisão e a globagem de palavras?

bash wildcards
  • 1 1 respostas
  • 304 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2020-07-19T07:51:21+08:002020-07-19T07:51:21+08:00

    Normalmente, esses são os casos em que não pode ou não faria sentido, portanto, os contextos não listados. Existem no entanto contextos não listados onde o faz, mas reclama quando resulta em mais do que um item, ou junta esses itens com espaços.

    Além disso, é importante fazer a distinção entre apenas correspondência de padrão curinga e geração ou globbing de nome de arquivo, que é a geração de uma lista de nomes de arquivo que correspondem a um padrão.

    Por exemplo, em [[ foo = * ]], não há globbing, pois *não é expandido para a lista de arquivos não ocultos no diretório atual, mas *ainda é interpretado como um padrão (aqui retorna true conforme foocorresponde ao *padrão).

    Ao dividir aqui, estamos nos referindo à divisão implícita que é feita na expansão de parâmetro sem aspas ( $param), substituição de comando ( $(...)e `...`) e expansão aritmética ( $((...))e $[...]), usando o $IFSparâmetro especial em contextos de lista .

    Tomaremos *como exemplo a seguir. Como padrão, corresponde a qualquer sequência de caracteres. Como um glob, ele se expande para todos os arquivos não ocultos no diretório atual (sujeito a dotglob, GLOBIGNORE...).

    O abaixo se aplica a bash, existem variações em outros shells.

    Casos em que não ocorre splitting e globbing:

    • quando citado (com '*', "*", \*, $'*', $"*").

    • dentro dos documentos aqui (esteja o delimitador entre aspas ou não):

      cat << EOF
      *
      EOF
      cat << 'EOF'
      *
      EOF
      
    • dentro de expressões aritméticas:

      • echo $((2 * 2))( *não é globbed mas $((...))sofre split+glob, tente depois IFS=4)
      • array[2 * 2]=4/ ${array[2 * 2]}/ exec {array[2*2]}>&1. Lembre-se de que você precisa das aspas em unset -v 'a[1]'( [1]é um curinga).
      • ((2 * 2))
      • echo $[2 * 2]
    • atribuição de variável escalar:

      • var=*
      • array[x]=*
      • hash[key]=*
      • array=([1]=*)(versões mais antigas bashcostumavam fazer globbing lá e fazer algo diferente quando havia um arquivo chamado 1=foono diretório atual, por exemplo).
      • var+=*
    • em chaves de array associativas:

      • typeset -A hash; hash[**]=value; v=${hash[**]}. *e @são especiais embora.
    • em atribuições após export/ local/ typeset/ declare/ readonlyapenas em algumas circunstâncias: a palavra-chave de atribuição e o nome da variável e =não devem ser citados nem mesmo em parte e não ser o resultado de qualquer expansão. atribuições e redirecionamentos podem ocorrer antes, mas commandnão podem ser usados.:

      • OK (sem split+glob):
        • export a=*
        • x=1 < /dev/null export foo a=*
      • não OK (split+glob executado):
        • ""export a=*
        • command export a=*(exceto no modo POSIX)
        • export "a"=*
        • export a\=*
        • "$(echo export)" a=*

      mais sobre isso em As aspas são necessárias para a atribuição de variáveis ​​locais?

    • case * in (...); esac

    • case x in (*); esac(sem split+glob, mas isso *é tratado como um padrão, que também se aplica ao curinga encontrado dentro de expansões sem aspas como em var=*; case x in ($var)).

    • dentro [[...]]. Observe que a correspondência de padrões é feita se curingas sem aspas estiverem presentes no lado direito dos operadores =, ==, .!=

    • aqui strings desde a versão 4.4. Nas versões anteriores, a divisão (mas não a globbing) era feita e as palavras resultantes eram unidas por espaços.

    • no alvo de redirecionamentos quando o shell está no modo POSIX e não interativo: bash -o posix -c 'echo test > *. Caso contrário, split+glob será executado e bashreportará um erro se for expandido para uma lista com menos ou mais de 1 elemento.

    • 4

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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