
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
xargs
lê 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 cat
em 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.txt
entã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.sh
para 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_script
contém apenas o seguinte.
#!/bin/bash
echo $1
Referência:Guia avançado de script Bash Capítulo 11. Loops e ramificações