El libre pensamiento para un internet libre
No estas registrado.
complemento a lo descrito por kcdtv
¿como se crean scripts en bash?
es muy sencillo. los scripts en bash se crean en el mismo orden como cuando hablamos de verdad, primero la pregunta después la respuesta.
los comandos que utilizare son los basicos para cualquier script.
empezare diciendo para que sirve cada cosa. empezamos.
#
sirve la almohadilla o gato en latinoamerica, para crear comentarios y que no sean leidos como parte del programa, solo para ser leidos por nosotros como comentario sirven para describir funciones o para poner notas sobre que hace cada funcion o como configur cada funcion si hubiera que cambiar valores manualmente.
ejemplo
# !/bin/bash
esta linea es muy importante para el sistema, al leer los script sepa de que tipo de archivo se trata, si es bash, python, pearl, ruby, etc, se pone al inicio del script, debe ser la primera linea siempre,
# estoy creando mi primer script en bash
# para imprimir en pantalla se usan los echo "" veamos el ejemplo
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
# en pantalla se veria asi
hola estamos creando nuestro primer script,
¿es esto correcto?si (S) (s)
no (N) (n)
----------------------------------------------------------------------------------------------------------
variables.
las variables se usan para no tener que escribir muchas lineas de codigo para un comando. imaginaros que queremos copiar un archivo de un directorio a otro pues podemos hacer una variable o dos variables, las variables son creadas con nombres, nunca pueden empezar por numeros. veamos los ejemplos. la llamaremos archivo
archivo=" "
archivo1=" "
archivo2=" "
y asi sucesivamente, ahora meteriamos la ruta de esta manera
archivo=" /usr/local/shared/background/foto1,jpg /home/ubuntu/Escritorio/mis-archivos/"
archivo1=" /usr/local/shared/background/foto1,jpg"
archivo2=" /home/ubuntu/Escritorio/mis-archivos/"
como lo que queriamos era copiarla pondriamos lo siguiente
para usar la llamada a las variables usamos $
ejemplo.
sudo cp -r $archivo
sudo cp -r $archivo1 $archivo2
---------------------------------------------------------------------------------------------------------
ahora veremos como crear menus o funciones.
usaremos el comando case esac,
case abriria el grupo de comandos mientras que esac lo cerraria.
usaremos antes de case un comando "read" para leer la información anterior en caso de ser un menú.
ejemplo práctico
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
si todo esto lo metemos en un menú sería así, "menu(){}"
menu(){
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
}
menu
para que funcione abra que poner el nombre del menú fuera de la función justo debajo del corchete si solo hay un menú, si hubiera mas solo poner el primero..... ejemplo
----------------------------------------------------------------------------------------------------------
menu(){
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
}
menu1(){
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
}
menu2(){
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
}
menu
----------------------------------------------------------------------------------------------------------
si quereis crear un bucle del mismo menu, para que no se cierre el programa hasta que vosotros lo querais detener. solo hay que poner debajo de esac el nombre del menu o funcion. ejemplo
menu2(){
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
read -p "presione lo que corresponda " a
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
menu2
}
menu
----------------------------------------------------------------------------------------------------------
para cerrarlo bastaria con meter una linea de codigo en el script en case o cerrarlo con crtl + c, mas comodo seria en el propio script añadiendo esto.
un echo antes del read con esto
echo "(e)xit"
y en case.
e) exit ;; # asi cerramos el programa
e) exit & exit ;; # asi cerramos el programa y la terminal
----------------------------------------------------------------------------------------------------------
para poner colores en el script que nos mostrarà la terminal se pueden poner
los colores de dos formas.
primera forma con su valor real
amarillo
\033[1;33m
rojo
\033[31m
verde
\033[32m
blanco
\033[1;37m
azul
\033[1;36m
azul1
\033[0;34m
amarillo
\033[1;33m
orange
\033[0;33m
magenta
\033[1;35m
gris
\033[1;30m
colorbase, color original de la terminal, normalmente blanco
\E[0m
# el color base es el color que tenemos en nuestra terminal
venga por defecto o porque lo hayamos cambiado, normalmente es blanco.
de esta manera es mas complicado ya que debemos recordar cada codigo de color,
esto se pondria asi en los echos, los echos al llevar color se le añade -e, el resultado seria asi. echo -e "" ejemplo practico.
menu(){
echo -e " \033[1;36m hola estamos creando nuestro primer script,"
echo -e " \033[1;36m¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo -e "\033[32m si (S) (s)"
echo -e "\033[31m no (N) (n) \E[0m"
read -ep "presione lo que corresponda " a
case $a in
S) echo -e" \033[32m si, es correcto";;
N) echo -e "\033[31m no es correcto";;
s) echo -e " \033[32m si, es correcto" ;;
n) echo -e "\033[31m no es correcto";;
*) echo -e "\033[31m opcion incorrecta, \033[32m seleccione opcion correcta \E[0m ";;
esac
menu
}
menu
lo mejor es crear las variables en el mismo script y asi solo poner el nombre de las variantes. ejemplo
###############################
# colores constantes en script#
# con variables #
amarillo="\033[1;33m" #
rojo="\033[31m" #
verde="\033[32m" #
blanco="\033[1;37m" #
azul="\033[1;36m" #
azul1="\033[0;34m" #
amarillo="\033[1;33m" #
orange="\033[0;33m" #
magenta="\033[1;35m" #
gris="\033[1;30m" #
colorbase="\E[0m" #
###############################
menu(){
echo -e "$azul hola estamos creando nuestro primer script,"
echo -e "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo -e "$verde si (S) (s)"
echo -e "$rojo no (N) (n)$colorbase"
read -ep "presione lo que corresponda " a
case $a in
S) echo -e "$verde si, es correcto";;
N) echo -e "$rojo no es correcto";;
s) echo -e "$verde si, es correcto" ;;
n) echo -e "$rojo no es correcto";;
*) echo -e "$rojo opcion incorrecta,$verde seleccione opcion correcta $colorbase";;
esac
menu
}
menu
edit:1
simplificando codigo
menu(){
echo -e "$azul hola estamos creando nuestro primer script,
¿es esto correcto?
$verde si (S) (s)
$rojo no (N) (n)$colorbase \n"
read -ep "presione lo que corresponda " a
case $a in
S | s) echo -e "$verde si, es correcto";;
N | n) echo -e "$rojo no es correcto";;
*) echo -e "$rojo opcion incorrecta,$verde seleccione opcion correcta $colorbase";;
esac
menu
}
menu
mismo código pero modificado case y esac al comando IF y ELIF.
totalmente funcional para que lo probéis y lo entendais
IF significa SI (condicional) en español. Su funcionamiento es simple. Se evalúa una condición, si es verdadera ejecuta un código, si es falsa, ejecuta otro código (o continúa con la ejecución del programa).
La estructura de if ... elif ... else ... permite encadenar varias condiciones.
elif es una contracción de else if
if (1ª condición)
ejecuta esto si la condición es verdadera
elif (2ª condición)
Si no se cumple la condición 1 pero sí que se cumple la condición 2, se ejecuta la condición 2
else
ejecuta esto si la condición es falsa
#!/bin/bash
amarillo="\033[1;33m"
rojo="\033[31m"
verde="\033[32m"
blanco="\033[1;37m"
azul="\033[1;36m"
azul1="\033[0;34m"
orange="\033[0;33m"
magenta="\033[1;35m"
gris="\033[1;30m"
colorbase="\E[0m"
menu(){
echo -e "$azul hola estamos creando nuestro primer script,
¿es esto correcto?
$verde si (S) (s)
$rojo no (N) (n)$colorbase \n"
read -ep "presione lo que corresponda " a
if [ $a = "S" ]; then
echo -e "$verde\n si, es correcto \n"
elif [ $a = "s" ]; then
echo -e "$verde\n si, es correcto \n"
elif [ $a = "N" ]; then
echo -e "$rojo\n no es correcto \n"
elif [ $a = "n" ]; then
echo -e "$rojo\n no es correcto \n"
else
echo -e "$rojo\n opcion incorrecta,$verde seleccione opcion correcta $colorbase\n"
fi
menu
}
menu
---------------------------------------------------------------------------------------------------------
y esto seria todo lo básico para crear scripts. lo demás ya depende de vuestra imaginación
Ultima edición por crash (19-03-2018 04:17:58)
Desconectado
He divido tu post para hacer un tema a parte porque no es un complemento, es offtopic... Te adelantas y hablas de las cosas que se ven en los cursos siguientes.
Luego tu post es confuso principalmente porque hay problemas de sintaxis en tus ejemplos y vas demasiado rápido, no creo que sea una buena idea enseñar a hacer un script en un solo post.
Es importante intentar ser preciso al máximo cuando quieres enseñar algo para no enseñar malos hábitos.
Por esto quizá es mejor paso a paso...
...Bueno, las cosas confusas:
Es inútil (y contraproducente en la ejecución del script) repetir echo a cada linea:
echo " hola estamos creando nuestro primer script,"
echo "¿es esto correcto?"
echo "" # asi dejamos un espacio en blanco
echo "si (S) (s)"
echo "no (N) (n)"
Ademas das a pensar con tu sintaxis que es necesario escribir echo a cada linea.
Creo que sería es más acertado explicar lo que es un separador...
En todos casos un mensaje a enseñar en consola se debe redactar así
echo " hola estamos creando nuestro primer script,
¿es esto correcto?
echo si (S) (s)
echo no (N) (n)"
Un "echo" y dos separadores, no hace falta cuarenta ordenes
Luego las almohadillas para comentarios que no existen sobran
################################
# colores constantes en script con variables#
amarillo="\033[1;33m" #
rojo="\033[31m" #
verde="\033[32m" #
blanco="\033[1;37m" #
azul="\033[1;36m" #
azul1="\033[0;34m" #
amarillo="\033[1;33m" #
orange="\033[0;33m" #
magenta="\033[1;35m" #
gris="\033[1;30m" #
colorbase="\E[0m" #
################################
...Es más: Das a pensar que es necesario usar una almohadilla en fin de comentario cuando no es así
Es código sucio que no debería estar ahí,
################################
# colores constantes en script con variables
amarillo="\033[1;33m"
rojo="\033[31m"
verde="\033[32m"
blanco="\033[1;37m"
azul="\033[1;36m"
azul1="\033[0;34m"
amarillo="\033[1;33m"
orange="\033[0;33m"
magenta="\033[1;35m"
gris="\033[1;30m"
colorbase="\E[0m"
################################
No tiene sentido redactar tu bucle "case esac" asÍ:
case $a in
S) echo "si, es correcto";;
N) echo "no es correcto";;
s) echo "si, es correcto" ;;
n) echo "no es correcto";;
*) echo " opcion incorrecta, seleccione opcion correcta";;
esac
La acción a ejecutar es la misma para S y s. La acción a ejecutar para N es la msima que para n... ¿Por qué hacer 5 lineas y duplicar código? Ensucias el codigo y ralentizas la ejecución (más condiciones a iterar)
Se debe redactar así:
read -p "presione lo que corresponda " a
case $a in
S | s) echo "si, es correcto";;
N | n) echo "no es correcto";;
* ) echo " opcion incorrecta, seleccione opcion correcta";;
esac
Y, aunque no es necesario en bash, un poco de "indentation" como se hace con ptyhon o C está bienvenida, sobre todo en algo destinado hacía principiantes. Y para tí también: Cuando estas al tercero o cuarto bucle a dentro de un bucle te simplifica mucho la vida tomar el tiempo de "identar" tus scripts
Desconectado
se trata de que aprendan a entenderlo diferenciando la parte de la pregunta a la parte de la respuesta. después ya se explica cómo mejorar el código. aunque te has adelantado un poco kcdtv. jajajajaja y encima has cometido un error por las prisas.
echo " hola estamos creando nuestro primer script,
¿es esto correcto?echo si (S) (s)
echo no (N) (n)"
la opción correcta seria asi
echo " hola estamos creando nuestro primer script,
¿es esto correcto?si (S) (s)
no (N) (n)"
para un salto de linea se puede hacer de varias formas; con un
echo
con el salto de linea \n al final de una frase, y así dejamos un espacio en blanco.
\n
ejemplo
echo "este es mi primer script \n"
o simplemente desplazando la ultima comilla una línea mas abajo
echo "este es mi primer script
"
y aquí continuariamos en esta línea con el resto de comandos o frases, bla bla bla.
kcdtv lo de los colores es porque era un cuadrado con el signo # para diferenciarlo en el script. o destacarlo para encontrarlo antes y poder ser modificado. no se presta a confusión, puesto que ya se sabe que es usado para la primera línea o para comentarios, para explicar lo que hace o lo que se a de modificar a mano.
en esta parte tienes razón, pero si no aprenden a entenderlo como funciona primero, si se lo das asi. entonces se lo complicas mas.
read -p "presione lo que corresponda " a
case $a in
S | s) echo "si, es correcto";;
N | n) echo "no es correcto";;
* ) echo " opcion incorrecta, seleccione opcion correcta";;
esac
Y, aunque no es necesario en bash, un poco de "indentation" como se hace con ptyhon o C está bienvenida, sobre todo en algo destinado hacía principiantes. Y para tí también: Cuando estas al tercero o cuarto bucle a dentro de un bucle te simplifica mucho la vida tomar el tiempo de "identar" tus scripts
esta parte no la entendido a qué te refieres con lo de identar...
esa palabra no existe en español o desconozco su significado.
Desconectado
esta parte no la entendido a qué te refieres con lo de identar...
Pienso que quiere decir, comentar el codigo con # mi comentario aqui
EDIT: vengo de ver el post mas en profundidad
Lo que falta sobre todo es explicar los comandos clasicos de bash.Por ejemplo hablas de cp pero para los princiante se tiene que hablar de ls, mv, cd, cat, grep, touch, rm y cosas asi antes de hablar de codigo propio.
Ultima edición por Koala (19-03-2018 12:00:23)
Desconectado
Totalmente de acuerdo con koala,
Son demasiadas cosas sin explicar realmente lo que sea.
Publicaste tu post en el paso uno del curso de introducción que he hecho y hablas de cosas que empiezo a evocar (condiciones) en el paso cuatro....
El bucle "case esac" es el capitulo 3.2.4.2 en la guía oficial bash y tú llegas ahí en un post,
Luego me parece contraproducente y extremadamente confuso enseñar códigos mal redactados para luego rectificarlos.
Es mejor abordar menos cosas, hacerlas bien y explicarlas más, en mi opinión.
esta parte no la entendido a qué te refieres con lo de identar...
esa palabra no existe en español o desconozco su significado.
¿No la conoces? "Indentation" es una palabra inglesa (por esto la he puesto entre ganchillos) que se usa en programación.
Bash no requiere identation pero es generalmente mandataria en los lenguajes de programación.
Consiste en usar tab (o espacios pero hay polémica ) para, por ejemplo, abrir un bucle.
Si no lo haces en python, C etc... tienes un error; así que es una de la primera cosas que se aprende, antes de redactar un bucle.
2.1.7 Indentation
Leading whitespace (spaces and tabs) at the beginning of a logical line is used to compute the indentation level of the line, which in turn is used to determine the grouping of statements.
First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line's indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.
python reference manual
Es una buena practica que se usa por convención (no es obligatoria) en los scripts bash
Por ejemplo en la guía oficial bash la usan, como puedes ver en este ejemplo
Here is an example using case in a script that could be used to describe one interesting feature of an animal:
echo -n "Enter the name of an animal: " read ANIMAL echo -n "The $ANIMAL has " case $ANIMAL in horse | dog | cat) echo -n "four";; man | kangaroo ) echo -n "two";; *) echo -n "an unknown number of";; esac echo " legs."
bash reference manual
Notas que después abrir el "case" ponen unos espacio para que se entienda mejor dónde empieza y acaba cada bucle.
Más los scripts son complejos y más es útil. Es un buen habito a tomar cuando empiezas.
Desconectado
Es importante intentar ser preciso al máximo cuando quieres enseñar algo para no enseñar malos hábitos.
Lo que falta sobre todo es explicar los comandos clasicos de bash......y mas cosas asi antes de hablar de codigo propio.
Dejemos acabar a kcdtv su aporte antes de pretender enmendarlo.
Ultima edición por Patcher (20-03-2018 08:24:08)
Desconectado
Tema | Respuestas | Vistas | Ultimo mensaje |
---|---|---|---|
0 | 165 | Ayer 00:30:11 por maxi | |
14 | 2412 | 29-06-2022 13:19:48 por kcdtv | |
Error de inicio en entorno gráfico por Hunter310#
|
24 | 15134 | 20-06-2022 12:22:19 por kcdtv |
15 | 2746 | 10-06-2022 09:13:42 por kcdtv | |
0 | 252 | 02-06-2022 10:05:09 por kcdtv |
Ultimo usuario registrado: maxi
Usuarios registrados conectados: 1
Invitados conectados: 14
Conectados: Miguelillo0
Número total de usuarios registrados: 2,319
Número total de temas: 1,588
Número total de mensajes: 15,144
Atom tema feed - Impulsado por FluxBB