iterar sobre o arquivo e enviar linhas como parâmetros posicionais para outro arquivo

iterar sobre o arquivo e enviar linhas como parâmetros posicionais para outro arquivo

Gostaria de iterar um arquivo contendo datas (chamado date.txt) no seguinte formato:

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

E passe cada campo de cada linha como parâmetro posicional para outro script.

ou seja: o outro script é executado colocando o seguinte na linha de comando:

$ . the_script 2009 08 03 08 09

eu tenteifor i in $(./dates.txt);do echo ${i};done

mas pegue:

./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found

a partir disso, posso dizer que está funcionando em cada linha, mas talvez ficando preso em cada campo?

Por causa do exposto, ainda consegui descobrir como passar as linhas lidas como parâmetros posicionais para o outro script. Não sabe onde trabalhar? Ajuda por favor!

Responder1

Talvez você queira dizer algo assim?

while read -d $'\n' i; do echo $i;done <./dates

while read -d $'\n' i; do . the_script $i;done <./dates

Responder2

Se sourcing ( .) não for necessário, isso soará como um trabalho paraxargs:

xargs -a dates.txt -rL1 the_script
  • xargslê uma linha de entrada e a utiliza como argumento para o comando especificado. O delimitador de linha padrão é a nova linha.
  • Podemos canalizar dados para ele a partir de outros comandos ou especificar um arquivo de entrada usando -a.
  • Como exatamente uma linha deve ser usada por invocação do script, especificamos as opções -r(não executar se a linha estiver vazia) e -L(usar no máximo N linhas por invocação).

Responder3

Use catem seu comando e certifique-se de usar o caminho correto para o nome do arquivo se os scripts não estiverem no mesmo diretório. Se a lista for dates.txtentão use $(cat ./dates.txt).Erro de digitação editado aqui. Incluir o .txt

Aqui está um exemplo:

Uma lista de datas nomeadas dates.txt.

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

Um script nomeado lstdates.shpara ecoar os planetas dessa lista.Editado Isso é executado em um subshell para o separador de campo interno (IFS)1não é alterado fora do subshell2.

#!/bin/bash
# Listing each date as an argument for `the_script`.

# Parenthesis runs in a subshell    
( 
  # IFS line break
  IFS=$'\012'
  for dates in $(cat ./dates.txt)
  do
    echo $(./the_script $dates)
  done
)

Por padrão, o IFS reconhece cada espaço em branco como o final de um campo. IFS=$'\012'reconhece cada nova linha como o final de um campo. Se cada linha estiver entre aspas duplas, como "2009 08 03 08 09", o IFS padrão funcionará.

the_scriptcontém apenas o seguinte.

#!/bin/bash
echo $1

Referência:Guia avançado de script Bash Capítulo 11. Loops e ramificações

informação relacionada