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
Gostaria de fazer uma iteração em um arquivo contendo datas (nomeadas dates.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 um parâmetro posicional para outro script.
ie: o outro script é executado colocando o seguinte na linha de comando:
$ . the_script 2009 08 03 08 09
Eu tentei for i in $(./dates.txt);do echo ${i};done
mas obtenha:
./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
disso eu posso dizer que está trabalhando em cada linha, mas talvez ficar pendurado em cada campo?
Por causa do acima, ainda fui capaz de descobrir como passar as linhas de leitura como parâmetros posicionais para o outro script. Não tem certeza de onde trabalhar isso? Ajuda por favor!
Se o fornecimento ( .
) não for necessário, isso parece um trabalho para xargs
:
xargs -a dates.txt -rL1 the_script
xargs
lê uma linha de entrada e depois a utiliza para argumentos do comando especificado. O delimitador de linha padrão é a nova linha. -a
. -r
(não executar se a linha estiver vazia) e -L
(usar no máximo N linhas por chamada). 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
, use $(cat ./dates.txt)
. Erro de edição aqui. Inclua o arquivo .txt
Aqui está um exemplo:
Uma lista de datas com o nome 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 chamado lstdates.sh
para fazer eco dos planetas nessa lista. Editado
Isso é executado em um sub shell para que o separador de campo interno (IFS) 1 não seja alterado fora do campo. subshell 2 .
#!/bin/bash
# Listing each date as an argument for 'the_script'.
# Parenthesis runs in a subshell
(
# IFS line break
IFS=$'2'
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=$'2'
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 de script Capítulo 11. Loops e filiais
Tags bash shell-script