El libre pensamiento para un internet libre

No estas registrado.  

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#1 17-03-2018 15:16:55

crash
Usuario

Registrado: 25-10-2017
Mensajes: 814

¿Cómo se crean scripts en bash?

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

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#2 18-03-2018 21:17:01

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,120

Re: ¿Cómo se crean scripts en bash?

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. big_smile
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  big_smile 

  • 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

#3 19-03-2018 02:31:46

crash
Usuario

Registrado: 25-10-2017
Mensajes: 814

Re: ¿Cómo se crean scripts en bash?

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.

kcdtv escribió:

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.

kcdtv escribió:

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

kcdtv escribió:

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

#4 19-03-2018 09:41:19

Koala
Very Important Usuario

Registrado: 11-09-2016
Mensajes: 733

Re: ¿Cómo se crean scripts en bash?

esta parte no la entendido a qué te refieres con lo de identar...

Pienso que quiere decir, comentar el codigo con # mi comentario aqui   cool


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)


Hostbase rogue AP project con Kali-linux xfce.

Debian--Arch--Kali--DFlinux

Desconectado

#5 19-03-2018 14:30:21

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,120

Re: ¿Cómo se crean scripts en bash?

Totalmente de acuerdo con koala, smile
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, tongue
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.

crash escribió:

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 big_smile ) 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.   

manual ofical python escribió:

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

#6 20-03-2018 08:23:02

Patcher
Very Important Usuario

Registrado: 14-01-2016
Mensajes: 500

Re: ¿Cómo se crean scripts en bash?

kcdtv escribió:

Es importante intentar ser preciso al máximo cuando quieres enseñar algo para no enseñar malos hábitos.

koala escribió:

Lo que falta sobre todo es explicar los comandos clasicos de bash......y mas cosas asi antes de hablar de codigo propio.

plus_un

Dejemos acabar a kcdtv su aporte antes de pretender enmendarlo.

Ultima edición por Patcher (20-03-2018 08:24:08)

Desconectado

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

Temas similares

Tema Respuestas Vistas Ultimo mensaje
Pegado:
Pegado:: 1ª Sorteo Del Mercadillo por josep345  [ 1 2 3 8 ]
184 4320 Ayer 23:32:52 por kcdtv
116 1257 Ayer 21:27:10 por crash
83 13806 Ayer 14:08:26 por kcdtv
10 192 Ayer 10:15:37 por crash
Presentacion. por Panet38
2 49 15-07-2018 13:35:36 por josep345

Pie de página

Información del usuario

Ultimo usuario registrado: guidofawkes
Usuarios registrados conectados: 0
Invitados conectados: 8

Estadisticas de los foros

Número total de usuarios registrados: 1,067
Número total de temas: 1,093
Número total de mensajes: 10,977

Máx. usuarios conectados: 69 el 15-10-2017 09:23:21