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 / 413756
Accepted
user267935
user267935
Asked: 2017-12-30 18:11:14 +0800 CST2017-12-30 18:11:14 +0800 CST 2017-12-30 18:11:14 +0800 CST

bash muda seu comportamento dependendo do valor da variável "IFS"

  • 772

Quando defino a IFSvariável para um espaço, bashtrata vários espaços como um espaço ( myprogramé um programa que imprime os argumentos de linha de comando que recebe):

IFS=" "
x="hello   hi   world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world

Mas quando defino a IFSvariável para uma vírgula, bashnão trata várias vírgulas como uma vírgula:

IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] = 
argv[3] = 
argv[4] = hi
argv[5] = 
argv[6] = 
argv[7] = world

Por que é que?

bash shell
  • 1 1 respostas
  • 710 Views

1 respostas

  • Voted
  1. Best Answer
    John1024
    2017-12-30T18:22:40+08:002017-12-30T18:22:40+08:00

    Isso está documentado em man bash. Uma única ocorrência de qualquer caractere no IFS que não seja um espaço em branco delimita um campo.

    De man bash:

    O shell trata cada caractere do IFS como um delimitador e divide os resultados das outras expansões em palavras usando esses caracteres como terminadores de campo. Se o IFS não estiver definido, ou seu valor for exatamente <space><tab><newline>, o padrão, então as sequências de <space>, <tab>, e <newline>no início e no final dos resultados das expansões anteriores são ignoradas e qualquer sequência de caracteres IFS que não esteja no início ou no final serve para delimitar palavras. Se o IFS tiver um valor diferente do padrão, as sequências dos caracteres de espaço em branco espaço, tabulação e nova linha serão ignoradas no início e no final da palavra, desde que o caractere de espaço em branco esteja no valor de IFS (um caractere de espaço em branco IFS ). Qualquer caractere no IFS que não seja um espaço em branco IFS, juntamente com quaisquer caracteres de espaço em branco IFS adjacentes, delimita um campo. Uma sequência de caracteres de espaço em branco IFS também é tratada como um delimitador. Se o valor de IFS for nulo, não ocorrerá nenhuma divisão de palavra. [Enfase adicionada.]

    Exemplos: divisão de campo

    Se o IFS não tiver caracteres de espaço em branco, os espaços em branco serão incluídos nos campos:

    $ ( IFS=',' x='one , two,three'; printf "<%s>\n" $x )
    <one >
    < two>
    <three>
    

    Se o IFS tiver espaços em branco e uma vírgula, as sequências de espaços em branco, seguidas por uma vírgula, seguidas por sequências de espaços em branco serão tratadas como um único delimitador:

    $ ( IFS=' ,' x='one , two,three'; printf "<%s>\n" $x )
    <one>
    <two>
    <three>
    

    Sequências de vírgulas são interpretadas como sequências de campos vazios:

    $ ( IFS=' ,' x='one,,,two,three'; printf "<%s>\n" $x )
    <one>
    <>
    <>
    <two>
    <three>
    

    Exemplos: espaço em branco inicial e final

    Se o IFS não contiver espaços em branco, todos os espaços em branco à esquerda e à direita serão mantidos nos campos:

    $ ( IFS=',' x='  one , two,three  ,'; printf "<%s>\n" $x )
    <  one >
    < two>
    <three  >
    

    Se o IFS contiver espaços em branco, todas as sequências iniciais ou finais de espaços em branco serão removidas:

    $ ( IFS=' ,' x='  one , two,three  ,'; printf "<%s>\n" $x )
    <one>
    <two>
    <three>
    
    • 20

relate perguntas

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

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

  • Como salvar um caminho com ~ em uma variável?

  • 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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +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
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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