Poner la salida de un comando con la interacción dentro de una variable durante el uso de grep en bash
Pregunta
Este programa que utilizo tiene sus propias variables para establecer cuando se ejecuta, por lo que quiero para establecer esas variables y luego greping la salida almacenarlo dentro de una variable. Sin embargo, no sé cómo hacer esto de la manera correcta. La idea que tengo no funciona. La atención se centra en las líneas 7 a 14.
1 #!/usr/local/bin/bash
2 source /home/gempak/NAWIPS/Gemenviron.profile
3 FILENAME="$(date -u '+%Y%m%d')_sao.gem"
4 SFFILE="$GEMDATA/surface/$FILENAME"
5 echo -n "Enter the station ID: "
6 read -e STATION
7 OUTPUT=$(sflist << EOF
8 SFFILE = $SFFILE
9 AREA = @$STATION
10 DATTIM = all
11 SFPARM = TMPF;DWPF
12 run
13 exit
14 EOF)
15 echo $OUTPUT
Pero me sale esto:
./listweather: line 7: unexpected EOF while looking for matching `)'
./listweather: line 16: syntax error: unexpected end of file
Solución
La elaboración de respuestas de todos, me encontré con una solución de trabajo a mí mismo. Este código funciona para mí:
#!/usr/local/bin/bash
source /home/gempak/NAWIPS/Gemenviron.profile
FILENAME="$(date -u '+%Y%m%d')_sao.gem"
SFFILE="$GEMDATA/surface/$FILENAME"
echo -n "Enter the station ID: "
read -e STATION
OUTPUT=$(sflist << EOF
SFFILE = $SFFILE
AREA = @$STATION
DATTIM = ALL
SFPARM = TMPF;DWPF
run
exit
EOF
)
echo $OUTPUT | grep $STATION
Gracias a todos!
Otros consejos
Yo pondría el programa se ejecute en un archivo de script .sh por separado, y luego ejecutar el script desde el primer archivo, pasando los argumentos que desea pasar como argumentos de línea de comandos. De esa manera se puede probar por separado.
También puede hacerlo de una función, pero me gusta la modularidad del segundo guión. No udnerstand exactamente lo que está tratando de hacer el anterior, pero algo como:
runsflist.sh:
#!/bin/bash
FILENAME="$(date -u '+%Y%m%d')_sao.gem"
SFFILE="$GEMDATA/surface/$FILENAME"
AREA = @$STATION
DATTIM = all
SFPARM = TMPF;DWPF
grep $STATION | sflist
main.sh:
#!/bin/bash
echo -n "Enter the station ID: "
read -e STATION
OUTPUT=`runsflist.sh`
echo $OUTPUT
Si sflist necesita la interacción, me gustaría probar algo como esto:
SFFILE=$(
( echo SFFILE = "$SFFILE"
echo AREA = "@$STATION"
echo DATTIM = all
echo SFPARM = TMPF;DWPF
echo run
cat
) | sflist)
Desafortunadamente, usted tiene que escribir exit
como parte de la interacción.