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 / 415631
Accepted
yael
yael
Asked: 2018-01-09 09:43:50 +0800 CST2018-01-09 09:43:50 +0800 CST 2018-01-09 09:43:50 +0800 CST

Diferenças nos espaços em branco entre o script bash e o shell interativo

  • 772

Por favor, conselhos por que isso acontece.

de um shell bash do Linux:

ps
PID TTY          TIME CMD
20406 pts/0    00:00:01 bash
26896 pts/0    00:00:00 ps

eu corro o seguinte

str="a b c d"
printf "%s\n"  ` echo $str `
a
b
c
d

mas do script bash

#!/bin/bash
.
.
.
.

str="a b c d"
printf "%s\n"  ` echo $str `

ele imprime:

a b c d  

enquanto os resultados esperados do script devem ser assim:

a
b
c
d

O que está faltando no meu script bash? Talvez bash ENV, ou algo assim?

Eu também corro o shoptcomando do meu script bash e estes são os resultados:

  utocd  off
  cdable_vars  off
  cdspell  off
  checkhash  off
  checkjobs  off
  checkwinsize  off
  cmdhist  on
  compat31  off
  compat32  off
  compat40  off
  compat41  off
  direxpand  off
  dirspell  off
  dotglob  off
  execfail  off
  expand_aliases  off
  extdebug  off
  extglob  off
  extquote  on
  failglob  off
  force_fignore  on
  globstar  off
  gnu_errfmt  off
  histappend  off
  histreedit  off
  histverify  off
  hostcomplete  on
  huponexit  off
  interactive_comments  on
  lastpipe  off
  lithist  off
  login_shell  off
  mailwarn  off
  no_empty_cmd_completion  off
  nocaseglob  off
  nocasematch  off
  nullglob  off
  progcomp  on
  promptvars  on
  restricted_shell  off
  shift_verbose  off
  sourcepath  on
  xpg_echo  off
bash newlines
  • 1 1 respostas
  • 99 Views

1 respostas

  • Voted
  1. Best Answer
    jimmij
    2018-01-09T10:18:15+08:002018-01-09T10:18:15+08:00

    Posso reproduzir esse comportamento apenas em dois casos:

    1. substituição de comando com aspas duplas:

      #!/bin/bash
      
      str="a b c d"
      printf "%s\n"  "`echo $str`"
      
    2. ou mudou o Separador de Campo Interno ( IFSvariável), por exemplo:

      #!/bin/bash
      
      IFS=,
      str="a b c d"
      printf "%s\n" `echo $str`
      

    Em ambos os casos, a saída é

    $ ./test.sh
    a b c d
    

    Para reparar o primeiro caso, basta remover as aspas e, para restaurar, IFSbasta defini-lo como o valor padrão em algum lugar acima da substituição do comando.

    IFS=$' \t\n'
    

    Um pouco de explicação de por que a saída é diferente quando IFSalterada e o que ela tem em comum com aspas duplas?

    Vamos começar do final:

    printf "%s\n" a b c d
    

    é obviamente diferente de

    printf "%s\n" 'a b c d'
    

    No primeiro caso, temos quatro palavras separadas e printfas exibimos uma a uma, adicionando uma nova linha a elas. No segundo caso, o todo a b c dé tratado como uma única palavra e printfapenas a envia como tal para o terminal. E agora deve ser óbvio que a saída de `echo $str`é tratada como uma única palavra quando adicionalmente entre aspas duplas.

    Agora é onde IFScomeça a desempenhar um papel. Ou seja, tt é usado para dividir palavras após expansões, portanto, com padrão, IFS=$' \t\n'a expressão echo a b c dsai a b c d, mas com IFS=,ela se torna 'a b c d'- um único mundo, embora as aspas não tenham sido usadas explicitamente. Pode-se verificar isso mais claramente sem variável:

    $ IFS=,
    $ printf "%s\n"  `echo a b c d`
    a b c d
    
    $ IFS=$' \t\n'
    $ printf "%s\n"  `echo a b c d`
    a
    b
    c
    d
    

    Como observação final: é melhor usar uma $()forma de substituição de comando, não backticks, mas esse é um tópico diferente.

    • 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