https://grasswiki.osgeo.org/w/index.php?title=Shell_scripting/es&feed=atom&action=historyShell scripting/es - Revision history2024-03-29T05:46:13ZRevision history for this page on the wikiMediaWiki 1.41.0https://grasswiki.osgeo.org/w/index.php?title=Shell_scripting/es&diff=23311&oldid=prev⚠️Dat: Shell scripting/es2016-07-27T15:32:36Z<p>Shell scripting/es</p>
<p><b>New page</b></p><div>=== ¿Qué es esto? ===<br />
<br />
Esta página contiene información acerca de cómo hacer un script para la línea de comandos (shell) para GRASS GIS.<br />
<br />
<br />
<br />
'''La [https://es.wikipedia.org/wiki/Shell_%28inform%C3%A1tica%29 shell o intérprete de comandos]''' para los sistemas operativos Unix o similares a Unix, es esencialmente un intérprete o procesador de comandos, es una interfaz basada en texto a través de la cual se pueden pasar instrucciones al sistema operativo de la computadora. Uno o más comandos pueden ser escritos en un script (normalmente en un archivo de texto) lo que, puede ser leido y ejecutado por la shell. La shell más usada probablemente es la [https://es.wikipedia.org/wiki/Bash bash].<br />
<br />
El hacer un '''script''' ('''scripting''') es el acto de diseñar, escribir, probar, eliminar bugs, y mantener una serie de comandos que realizan una función específica, ya sea sencilla o compleja.<br />
<br />
<br />
<!''Note, content below transfered here from the page [http://grasswiki.osgeo.org/wiki/GRASS_and_Shell GRASS and Shell].''><br />
<br />
=== Haciendo un script para GRASS ===<br />
<br />
Es bastante sencillo escribir un trabajo de GRASS como un script de Shell que lanza GRASS, hace la operación y limpia los archivos temporales.<br />
<br />
Normalmente, es conveniente automatizar los trabajos repetitivos. GRASS puede ser controlado a través de scripts del usuario para facilitar el trabajo diario. ¿Cómo empezar?, el usar la línea de comandos de algún modo es como hacer scripts pero sin guardarlos - así que puedes escribir tu '''primer script''' guardando los comandos ejecutados en un archivo de texto (usa tu editor preferido, y de preferencia guarda el archivo en formato ASCII).<br />
<br />
'''Nota importante''': si no conoces sobre programación en la shell, y consideras aprenderlo, mejor echa un vistazo a Python (ej. [[GRASS and Python]])...<br />
<br />
<br />
== Un primer script de shell de GRASS ==<br />
<br />
Los comentarios deben empezar con el caracter '#'. La primer línea indica qué intérprete de shell se va a utilizar, aquí es "sh" , que está en el directorio /bi/.<br />
<br />
Un ejemplo sencillo, a correr dentro de una sesión de GRASS:<br />
<br />
<source lang="bash"><br />
#!/bin/sh<br />
# mi primer script,<br />
# copyright, año, Autor<br />
<br />
# mostrar la configuración actual de la región<br />
g.region -p<br />
<br />
# salir con estatus 0 que significa "ok":<br />
exit 0<br />
</source><br />
<br />
Guarda este archivo como "myscript.sh" y correlo dentro de GRASS GIS desde la línea de comandos:<br />
<br />
<source lang="bash"><br />
sh myscript.sh<br />
</source><br />
<br />
Debe mostrar la configuración de la región actual, finalizar y regresar a la línea de comandos.<br />
<br />
<br />
Para '''buscar errores en la shell (debugin)''', correr:<br />
<br />
<source lang="bash"><br />
sh -x myscript.sh<br />
</source><br />
<br />
Se mostrará cada línea lo cual ayuda a identificar errores.<br />
<br />
<br />
=== Example 1 (simple): d.rast.region ===<br />
<br />
Script para determinar la [[computational region/es]] a un mapa ráster ($1 es el parámetro para dar al script, aquí el nombre del mapa):<br />
<br />
<source lang="bash"><br />
#!/bin/sh<br />
# Autor: yo, hoy; copyright: GPL >= 2<br />
# Propósito: script para determinar la región computacional a un mapa ráster<br />
# Uso: d.rast.region rastermap<br />
<br />
g.region rast=$1<br />
d.erase<br />
d.rast $1<br />
exit 0<br />
</source><br />
<br />
Usar la script en la localización "Nort Carolina" de GRASS 6:<br />
<br />
<source lang="bash"><br />
d.mon x0<br />
sh d.rast.region elev_state_500m<br />
sh d.rast.region lsat7_2002_40<br />
</source><br />
<br />
=== Ejemplo 2 (mejorado): d.rast.region ===<br />
<br />
En este ejemplo, se asigna el primer parámetro ($1) dado al script (nombre del mapa) para una nueva variable que es más fácil para entender en el script. De nuevo, el script establece la región computacional a un mapa ráster, pero dice qué sucede:<br />
<br />
<br />
<source lang="bash"><br />
#!/bin/sh<br />
# Autor: yo, hoy; copyright: GPL >= 2<br />
# Purprósito: script para establecer la región computacional a un mapa ráster<br />
# Uso: d.rast.region rastermap<br />
<br />
# ser cuidadoso de no dejar espacios en blanco en la siguiente línea:<br />
map=$1<br />
g.message message="Estableciendo la región computacional al mapa <$map>"<br />
g.region rast=$map<br />
d.erase<br />
d.rast $map<br />
exit 0<br />
</source><br />
<br />
Usando el script en la localización "North Carolina": ver el ejemplo 1.<br />
<br />
=== Ejemplo 3 (mejorado de nuevo): d.rast.region ===<br />
<br />
Aquí se introduce la variable $0 que contiene el nombre del programa también como una prueba para mostrar el mapa especificado:<br />
<br />
<source lang="bash"><br />
#!/bin/sh<br />
# Autor: yo, hoy; copyright: GPL >= 2<br />
# Propósito: script para definir la región computacional un mapa ráster<br />
# Uso: d.rast.region rastermap<br />
<br />
if [ $# -lt 1 ] ; then<br />
echo "Parámetro no definido. Uso"<br />
echo " $0 rastermap"<br />
exit 1<br />
fi<br />
<br />
map=$1<br />
g.message message="Definiendo la región computacional al mapa <$map>"<br />
g.region rast=$map<br />
d.erase<br />
d.rast $map<br />
exit 0<br />
</source><br />
<br />
<br />
Para ver cómo funciona, es interesante usar el comprobador de errores de la shell (shell debugging):<br />
<br />
<source lang="bash"><br />
d.mon x0<br />
sh -x d.rast.region elev_state_500m<br />
</source><br />
<br />
=== Ejemplo 4: manipulación de parámetros ===<br />
<br />
Asume que quiere crear un script de shell para GRASS que tenga dos parámetro (coordenadas x y y) para calcular la cuenca relacionada con este punto de salida ({{cmd|r.water.outlet}}). En la shell, las variable $1 $2 y demás son parámetros que se pasan al script. Así, si se tiene un script llamado basin.sh y escribe<br />
<br />
<br />
<source lang="bash"><br />
sh basin.sh -23.3 -47.7<br />
</source><br />
<br />
La variable $1 será -23.3 y $2 será -47.6. En su script basin.sh puede usar la línea<br />
<br />
<source lang="bash"><br />
r.water.outlet drainage="your_map" basin="basin_map" easting=$2 northing=$1<br />
</source><br />
<br />
De la misma manera, se puede pasar un tercer parámetro para el nombre del mapa base, etc.<br />
<br />
Sin embargo, es altamente recomendable usar {{cmd|g.parser}} para la manipulación de los parámetros. Es más fácil y se crea una interfaz gráfica de manera automática, incluso,¡los mensajes estándar aparecerán ya traducidos! Se puede clonar a partir de scripts ya existentes, vea [http://trac.osgeo.org/grass/browser/grass/branches/releasebranch_6_4/scripts aquí algunos ejemplo].<br />
<br />
<br />
== Usando la salida de los módulos de GRASS en el script ==<br />
<br />
Algunas veces necesita usar la salida de un módulo para el siguiente paso en un script. La mayoría de los módulos de GRASS que producen una salida numérica ofrecen una bandera "-g" para facilitar el parseado de los resultados. Junto con la función "eval" de la shell se puede reducir el esfuerzo de usar la salida en el siguiente paso. El truco es que el signo de igual es considerado para asignar una variable en la shell:<br />
<br />
# Ejemplo en el conjunto de datos North Carolina<br />
inmap=elevation<br />
outmap=some_result<br />
<br />
Ejemplo para salida nomrnal de módulo:<br />
g.region rast=$inmap<br />
r.info -r $inmap<br />
min=55.57879<br />
max=156.3299<br />
<br />
Usando esto en un script:<br />
eval `r.info -r $inmap`<br />
r.mapcalc "$outmap = float($inmap) / $max"<br />
<br />
Verificar:<br />
r.info -r $outmap<br />
min=0.355522472489405<br />
max=0.999999772928615<br />
<br />
== Mejores prácticas en la programación shell ==<br />
<br />
Hay muchos libros sobre el tema, y el tema estará sujeto a preferencias personales, pero aquí hay algunos tips. Para parches enviados a GRASS, por favor siga las guías de código definidas en los archivos <source lang="bash" enclose="none">SUBMITTING</source> en el directorio principal del código fuente.<br />
<br />
* trate de alcanzar 50% de comentarios, iniciando con el caracter # (ver arriba). De esta manera entenderá el script años después-<br />
* añada un comentario inicial de qué es lo que hace el script<br />
* estudie los scrips existentes, por ejemplo [http://trac.osgeo.org/grass/browser/grass/branches/releasebranch_6_4/scripts estos]<br />
<br />
<br />
Manejo de errores:<br />
<br />
Un módulo que termina en un error fatal regresará un estatus no cero y salida (''non-zero exit status''), así que puede usar el comando con <code>if</code>, <code>||</code>, <code>&&</code>, etc., o probar el valor de <code>$?</code>.<br />
<br />
== Insertando coordenadas en un módulo ráster a partir de un mapa vectorial de puntos ==<br />
<br />
Algunos módulos ráster tienen la opción <code>coordinates=</code>, pero no tienen la opción para seleccionarlas a partir de un mapa vectorial de puntos. El siguiente ejemplo se refiere al módulo {{cmd|r.viewshed}}.<br />
<br />
Primero, debe tener un mapa vectorial con las coordenadas en la tabla de atributos; si no es así, añádalas con {{cmd|v.db.addcolumn}} y {{cmd|v.to.db}}.<br />
<br />
=== Ejemplo 1: r.viewshed - seleccionando un solo punto a partir de un mapa vectorial ===<br />
<source lang="bash"><br />
#!/bin/bash<br />
# Autor: Marco Curreli<br />
# Uso: sh myviewshed.sh cat<br />
# "cat" es la categoría del punto del mapa vectorial<br />
<br />
VECT=myvector<br />
<br />
ARG=1<br />
E_ERR_ARG=65<br />
if [ $# -ne "$ARG" ]<br />
### Verifica el número de argumentos ###<br />
then<br />
echo "Usage: $0 cat"<br />
exit $E_ERR_ARG<br />
fi<br />
<br />
# coordenadas del punto<br />
COR=$(v.db.select -c map=$VECT columns=x,y separator=, where="cat = $1")<br />
<br />
r.viewshed --verbose -c in=dtm out=visib_$1 coordinate=$COR obs_elev=2.75 memory=3000 stream_dir=tmp<br />
</source><br />
<br />
=== Ejemplo 2: r.viewshed - procesamiento en bloque para seleccionar puntos de un mapa vectorial ===<br />
<source lang="bash"><br />
#!/bin/bash<br />
# Autor: Marco Curreli<br />
# Uso: sh myviewshed_batch.sh cat1,cat2[,cat3,...] [cat3..catN]<br />
# "cat" es la categoría del punto del mapa vectorial<br />
# ejemplo: to selecting cats 1 3 5 6 7<br />
# sh myviewshed_batch.sh 1,3 5..7<br />
<br />
VECT=myvector<br />
<br />
CAT1=$(<br />
for index in $(eval echo {$1})<br />
do<br />
echo -n "$index "<br />
done<br />
<br />
echo<br />
)<br />
<br />
CAT2=$(<br />
for index in $(eval echo {$2})<br />
do<br />
echo -n "$index "<br />
done<br />
<br />
echo<br />
)<br />
<br />
ARG=1<br />
E_ERR_ARG=65<br />
if [ $# -lt "$ARG" ]<br />
then<br />
echo "Uso: $0 cat1,cat2[,cat3,...] [cat3..catN]<br />
se debe especificar al menos un argumento"<br />
exit $E_ERR_ARG<br />
fi<br />
<br />
# a trabajar con uno o dos argumentos<br />
if [[ -n $2 ]]<br />
then<br />
CATS=$(echo $CAT1 $CAT2)<br />
else<br />
CATS=$(echo $CAT1)<br />
fi<br />
<br />
echo categories: $CATS<br />
<br />
# lista de categorías con sus coordenadas<br />
for i in $CATS<br />
do<br />
v.db.select -c map=$VECT columns=cat,x,y separator=, where="cat = $i" >> ${VECT}_coord.csv<br />
done<br />
<br />
PTI=$(echo $(cat ${VECT}_coord.csv))<br />
<br />
<br />
for p in $PTI<br />
do<br />
set -- $p<br />
<br />
#coordenadas<br />
CORD=$( echo $p | gawk -F "," '{print $2","$3}')<br />
<br />
#categoría<br />
CAT=$( echo $p | gawk -F "," '{print $1}')<br />
<br />
r.viewshed --verbose --overwrite in=dtm out=visib_$CAT coordinate=$CORD obs_elev=2.75 memory=1500 stream_dir=tmp<br />
<br />
done<br />
<br />
rm ${VECT}_coord.csv<br />
</source><br />
<br />
[[Category:FAQ]]<br />
[[Category:Bash]]<br />
[[Category:Scripting]]<br />
[[Category:Linking to other languages]]<br />
[[Category:Languages/es]]</div>⚠️Dat