
Me gustaría recorrer un archivo que contiene fechas (llamado fechas.txt) en el siguiente 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
Y pase cada campo de cada línea como parámetro posicional a otro script.
es decir: el otro script se ejecuta poniendo lo siguiente en la línea de comando:
$ . the_script 2009 08 03 08 09
Yo he tratadofor i in $(./dates.txt);do echo ${i};done
pero consigue:
./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 de esto puedo decir que está funcionando en cada línea, pero ¿quizás se está quedando colgado en cada campo?
Debido a lo anterior, todavía he podido descubrir cómo pasar las líneas de lectura como parámetros posicionales al otro script. ¿No estás seguro de dónde trabajarlo tampoco? ¡Ayuda por favor!
Respuesta1
¿Quizás te refieres a algo como esto?
while read -d $'\n' i; do echo $i;done <./dates
while read -d $'\n' i; do . the_script $i;done <./dates
Respuesta2
Si no se necesita abastecimiento ( .
), esto parece un trabajo paraxargs
:
xargs -a dates.txt -rL1 the_script
xargs
lee una línea de entrada y luego la usa como argumentos para el comando especificado. El delimitador de línea predeterminado es la nueva línea.- Podemos canalizar datos desde otros comandos o especificar un archivo de entrada usando
-a
. - Dado que se utilizará exactamente una línea por invocación del script, especificamos las opciones
-r
(no ejecutar si la línea está vacía) y-L
(usar como máximo N líneas por invocación).
Respuesta3
Úselo cat
en su comando y asegúrese de usar la ruta correcta al nombre del archivo si los scripts no están en el mismo directorio. Si la lista es dates.txt
entonces use $(cat ./dates.txt)
.Error tipográfico editado aquí. Incluir el .txt
Aquí hay un ejemplo:
Una lista de fechas nombradas 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
Un guión nombrado lstdates.sh
para hacer eco de los planetas en esa lista.Editado
Esto se ejecuta en un subshell donde el separador de campo interno (IFS)1no se cambia fuera del 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
)
De forma predeterminada, IFS reconoce cada espacio en blanco como el final de un campo. IFS=$'\012'
reconoce cada nueva línea como el final de un campo. Si cada línea está entre comillas dobles como "2009 08 03 08 09"
, entonces el IFS predeterminado funcionará.
the_script
sólo contiene lo siguiente.
#!/bin/bash
echo $1
Referencia:Guía avanzada de secuencias de comandos Bash Capítulo 11. Bucles y ramas