Eu estava lendo este tópico: Como fazer um loop nas linhas de um arquivo?
O que é IFS
? E qual é o seu uso no contexto de for
-loops?
Eu estava lendo este tópico: Como fazer um loop nas linhas de um arquivo?
O que é IFS
? E qual é o seu uso no contexto de for
-loops?
IFS
significa - é um caractere que separa os campos. No exemplo que você postou, ele está definido como novo caractere de linha ( ); então, depois que você o definir, processará o texto linha por linha. Nesse exemplo, você pode alterar o valor de (para alguma letra existente em seu arquivo de entrada) e verificar como o texto será dividido.Input
Internal Field Separator
\n
for
IFS
BTW, a partir da resposta que você postou a segunda solução é a recomendada ...
Como @jasonwryan notou, não é Input
só Internal
. O nome Input
veio do awk
qual também há OFS
- Output Field Separator
.
S
foi para separador na concha Bourne de onde se originou. No shell Korn e na maioria dos outros shell tipo Bourne, como agora especificado porPOSIX
, oS
é para Delimiter (apenas estique um pouco sua imaginação), comoA::B:
por exemplo, é dividido em "A", "" e "B" (sem acréscimo adicional) ""). Isso é diferente deawk
'sFS
ou as
bandeira de expansão de parâmetros dezsh
.IFS
não está diretamente relacionado ao loop, está relacionado à divisão de palavras.IFS
determina indiretamente como a saída do comando é dividida em partes sobre as quais o loop é repetido.Quando você tem uma substituição de variável não protegida
$foo
ou substituição de comando$(foo)
, há dois casos:"$foo"
ou em uma atribuição de variávelx=$foo
, a sequência resultante da substituição é usada como está.$IFS
é considerado um separador de palavras. Por exemplo,IFS=":"; foo="12:34::78"; echo $foo
impressões12 34 78
(com dois espaços entre34
e78
, já que há uma palavra vazia).foo="*"; echo $foo
imprime a lista de arquivos no diretório atual.Para loops, como muitos outros contextos, espere uma lista de palavras. tão
quebra
$(foo)
em palavras e trata cada palavra como um padrão glob. O valor padrão deIFS
é espaço, tabulação e nova linha , portanto, sefoo
imprimir duas linhashello world
ehowdy
o corpo do loop for executado comx=hello
, entãox=world
ex=howdy
. SeIFS
for explicitamente alterado para conter apenas uma nova linha, o loop será executado parahello world
ehowdy
. SeIFS
for alterado para sero
, em seguida, o loop é executado parahell
, w
,rldh
(onde
é um caractere de nova linha) ewdy
.fonte
"IFS indirectly determines how ..."
?IFS
(diretamente) determina como a saída da substituição de comando é dividida, que então (indiretamente) determina o que o loop passa.A partir de
man bash
Essa é uma das variáveis internas do Bash. Ele determina como o Bash reconhece campos ou limites de palavras quando interpreta seqüências de caracteres.
Embora o padrão seja espaço em branco (espaço, tabulação e nova linha), ele pode ser alterado, por exemplo, para analisar um arquivo de dados separados por vírgula.
http://tldp.org/LDP/abs/html/internalvariables.html
fonte
Além das excelentes respostas anteriores, deixe-me acrescentar que o IFS é muito útil para a análise eficiente e portátil em casos simples em combinação com o conjunto . Eficiente, porque evita o uso de subcascas e ferramentas de desova, como grep ou sed:
Observe que precisamos armazenar e recuperar o valor anterior do IFS para evitar quebras indesejadas em outras partes do script.
fonte