Los comandos de Linux Essentials, creando script con editor VI.
El editor vi
es un potente editor de texto con una pequeña curva de aprendizaje, pero capaz de realizar una amplia variedad de tareas de edición de texto.
El editor vi
tiene dos modos: inserción y comando. En el modo de inserción se agrega el texto a un documento. En el modo de comandos, pueden realizarse las operaciones tales como la navegación, la búsqueda, guardar y salir del editor.
Creando un nuevo archivo.
vi archivo
Con i es posible cambiar al modo inserción de texto, la tecla esc saldra del modo inserción, :wq funcionará para escribir los cambios realizados y salir de la pantalla.
Para volver a invocar el editor y abrir el archivo creado se hace igual que cuando se creo… vi archivo.
Al entrar a vi este entrara en modo comando.
Estos son algunos comandos de navegación dentro de vi.
Teclas | Función |
---|---|
j | Mueve el cursor una línea hacia abajo (igual que la flecha hacia abajo) |
k | Mueve el cursor una línea hacia arriba (igual que la flecha hacia arriba) |
l | Mueve el cursor un carácter a la derecha (igual que la flecha derecha) |
h | Mueve el cursor un carácter a la izquierda (igual que la flecha izquierda) |
w | Mueve el cursor al principio de la siguiente palabra |
e | Mueve el cursor al final de la palabra |
b | Mueve el cursor al principio de la palabra anterior |
$ | Mueve el cursor al final de la línea actual (igual que la tecla Fin ) |
0 (zero) | Mueve el cursor al inicio de la línea actual (igual que la tecla Inicio ) |
3G | Salta a la tercera línea (nG salta a la enésima línea) |
1G | Salta a la primera línea |
Shift+G | Salta a la última línea |
dw | Elimina una palabra, posicionar el puntero a la izquierda |
u | Deshacer el ultimo cambio |
4u | Deshace 4 cambios |
2dw | Elimina dos palabras |
x | Elimina un caracter a la derecha |
10x | Elimina 10 caracteres |
dd | Elimina la linea actual |
p | Pega la linea eliminada o cualquier texte en el portapapeles |
2dd | Elimina 2 lineas, la actual y la siguiente |
4w | Moverse a la cuarta palabra. |
D | Eliminar hasta la derecha de la linea |
d$ | Eliminar hasta la derecha de la linea |
J | Une 2 lineas, la actual y la siguiente |
yw | Copia o jala la palabra actual |
3J | Une 3 lineas |
:%s/text //g | Busca text y lo elimina añadiendo un espacio |
~ | Cambia la letra seleccionada a mayúscula o minúscula |
a | Mueve el cursor a la derecha y entra en modo de inserción |
o | Abre una linea en blanco debajo de la línea actual |
O | Abre una linea en blanco arriba de la línea actual |
:x | Se guarda y cierra el archivo. |
:wq | Escribe al archivo y se cierra. |
:wq! | Escribe a un archivo de sólo lectura, si es posible, y se cierra. |
ZZ | Se guarda y se cierra. Observa que en este caso no se utilizan los dos puntos : . |
:q! | Salir sin guardar los cambios. |
:e! | Descartar los cambios y volver a cargar el archivo. |
:w! | Escribir a sólo lectura, si es posible. |
/palabra | Busca palabras, se posiciona el cursor al inicio. |
n | Se mueve entre instancias de busquedas. |
?palabra | Busca la palabra hacia atrás. |
cw | La palabra que se encuentra se puede editar, entrando el nuevo texto y desaparecioendo el viejo, entrara en modo inserción. |
A | Añade algo al final de la linea entrando igual al modo inserción. |
Advertencia: Si introduces cualquier otra clave que no sean las de arriba, puedes terminar en el modo de inserción. No te asustes! Presiona la tecla Esc , luego :q!
+ la tecla Entrar . Con esto debes salir del vi
sin guardar los cambios. ¡A continuación, ejecuta vi myfile
y regresas al editor vi
!
Creando script paso 1
Escribe lo siguiente en la terminal, puedes usar cualquier editor compatible.
vi ejemplo.sh
En el editor agrega lo siguiente.
#!/bin/bash
echo "Hello there! Here is the calendar for this month:"
cal
Para ejecutar ese script básico usa lo siguiente.
bash ejemplo.sh
Para evitar escribir bash delante del archivo podemos agregar permisos para que sea ejecutable con todos los usuarios.
chmod a+x ejemplo.sh
./ejemplo.sh
Una característica común que se utiliza en el scripting es «backquoting». Con esta técnica puedes ejecutar un comando shell «dentro» de otro comando shell. El resultado del comando interno será devuelto como un argumento para el comando externo. Añade lo siguiente a la parte inferior del archivo ejemplo.sh
.
echo "Today is" `date +%A`
Recuerda que la variable $PATH
se utiliza para buscar los comandos que introduces. Ejecuta lo siguiente para ver la variable $PATH
para la cuenta del administrador de sistemas.
echo $PATH
Ten en cuenta que home/sysadmin/bin
es uno de los directorios de la variable $PATH
. Este es un buen lugar para colocar tus scripts del shell.
mkdir bin
mv ejemplo.sh bin
ejemplo.sh
La Ejecución Condicional y Repetitiva
Ten en cuenta que estos ejemplos son más complejos. Con tal fin, vas a utilizar una técnica para describir lo que está sucediendo en el programa. La técnica se verá como la siguiente:
Introduce esta columna al conductor.sh | Esta columna describe el código (no introducir al archivo) |
---|---|
echo "Please enter your age" | # imprimir un prompt |
read age | # leer la entrada del usuario y colocar la variable $age |
Al seguir las instrucciones proporcionadas, debes introducir el texto de la columna izquierda en el archivo especificado (ejemplo1.sh
en el ejemplo anterior). La columna derecha se utiliza para describir las líneas específicas en el programa. El signo de gato #
se utiliza debido a que en un script de shell puedes colocar comentarios dentro de tu programa mediante el uso del carácter #
.
Scipts («Secuencias de comandos») que son más complejas pueden hacer uso de la ejecución condicional. Una expresión condicional, como la instrucción if
puede hacer uso de los resultados de un comando llamado test
. La instrucción test
compara dos números (o dos cadenas) para cosas como «igual a», «menor que», etc.
Crea el siguiente archivo (drive.sh
) y hazlo ejecutable para ver cómo las instrucciones if
y test
funcionan. Comienza por colocar lo siguiente en drive.sh
:
Introduce esta columna al conductor.sh | Esta columna describe el código (no introducir al archivo) |
---|---|
#!/bin/bash | |
echo "Please enter your age" | # imprimir un prompt |
read age | # leer la entrada del usuario y colocar la variable $age |
if test $age -lt 16 | # test $age -lt 16 devuelve «verdadero» si $age es numéricamente inferior a 16 |
then | |
echo "You are not old enough to drive." | # se ejecuta cuando la prueba es verdadera |
else | |
echo "You can drive!" | # se ejecuta cuando la prueba es falsa |
fi | # esto pone fin a la instrucción if |
A continuación, haz que el archivo sea ejecutable y ejecútalo:
cat drive.sh
chmod a+x drive.sh
./drive.sh
Verbalmente, podrías leer la instrucción if
como «If $age is less than 16, then echo ‘You are not old enough to drive’, else echo ‘You can drive!'» o «Si $ age es menor de 16, entonces echo ‘No tienes edad suficiente para conducir’, else echo ‘Puedes conducir’» en español. El fi
termina la instrucción if
.Importante: $age
debe ser un valor entero. Si no es así, el programa se bloqueará.
La instrucción de prueba se invoca automáticamente cuando colocas sus argumentos entre corchetes []
rodeados de espacios. Modifica la línea if
de drive.sh
para que se vea así:
if [ $age -lt 16 ]
A continuación, vuelve a ejecutar el programa:
cat conductor.sh
./conductor.sh
Para ver una lista completa de las condiciones de prueba, ejecuta el comando man test
.Importante: Alrededor de los corchetes tiene que haber espacios. [$age -lt 16]
no funcionaría, pero [ $age -lt 16 ]
sí.
También puedes utilizar el resultado de otros comandos, ya que todos regresan «éxito» o «fracaso». Por ejemplo, crea y ejecuta el programa siguiente, que se puede utilizar para determinar si una cuenta de usuario se encuentra en este sistema. Agrega lo siguiente a check.sh
: q
#!/bin/bash
echo "Enter a username to check: "
read name
if grep $name /etc/passwd > /dev/null
then
echo "$name is on this system"
else
echo "$name does not exist"
fi
A continuación, ejecuta los siguientes comandos:
chmod a+x check.sh
./check.sh
Cuando recibes un prompt para introducir el nombre de usuario, proporciona el valor de «root
». Vuelve a ejecutar el comando (./check.sh
) y proporciona el valor de «bobby
». Tu pantalla debe ser similar a la siguiente:
sysadmin@localhost:~$ cat check.sh
#!/bin/bash
echo "Enter a username to check: "
read name
if grep $name /etc/passwd > /dev/null
then
echo "$name is on this system"
else
echo "$name does not exist"
fi
sysadmin@localhost:~$ chmod a+x check.sh
sysadmin@localhost:~$ ./check.sh
Enter a username to check:
root
root is on this system
sysadmin@localhost:~$ ./check.sh
Enter a username to check:
bobby
bobby does not exist
sysadmin@localhost:~$
Otra instrucción condicional común se llama el while
loop. Esta instrucción se utiliza para ejecutar el código en varias ocasiones, siempre y cuando una comprobación condicional devuelva el valor «verdadero». Comienza colocando lo siguiente en un archivo denominado num.sh
:
Introduce esta columna al drive.sh | Esta columna describe el código (no introducir al archivo) |
---|---|
#!/bin/bash | |
echo "Please enter a number greater than 100" | echo «Ingrese un número mayor que 100» |
read num | leer num |
while [ $num -le 100 ] | # ejecutar el código desde «do» hasta «hecho si la condición de prueba es verdadera |
do | |
echo "$num is NOT greater than 100." | echo «$num no es mayor que 100.» |
echo "Please enter a number greater than 100" | echo «Ingrese un número mayor que 100» |
read num | leer num |
done | # Esto pone fin a la instrucción |
echo "Finally, $num is greater than 100" | echo «Finalmente, el número es mayor que 100» |
A continuación, haz que el archivo sea ejecutable y ejecútalo:
chmod a+x num.sh
./num.sh
Cuando recibes un prompt para introducir un número, proporciona el número 25
. Cuando vuelves a recibir el prompt, introduce el número 99
. Por último, introduce 101
cuando recibas el prompt para introducir un número por tercera vez. Tu pantalla debe ser similar a la siguiente:
sysadmin@localhost:~$ cat num.sh
#!/bin/bash
echo "Please enter a number greater than 100"
read num
while [ $num -le 100 ]
do
echo "$num is NOT greater than 100."
echo "Please enter a number greater than 100."
read num
done
echo "Finally, $num is greater than 100"
sysadmin@localhost:~$ chmod a+x num.sh
sysadmin@localhost:~$ ./num.sh
Please enter a number greater than 100
25
25 is NOT greater than 100.
Please enter a number greater than 100.
99
99 is NOT greater than 100.
Please enter a number greater than 100.
101
Finally, 101 is greater than 100
sysadmin@localhost:~$
Si la prueba condicional para la instrucción while
( [ $num -le 100 ]
) devuelve valor verdadero, entonces las instrucciones entre do
y done
serán ejecutadas.
Una vez que esas instrucciones se acaben de ejecutar, la prueba condicional para la instrucción while
se comprueba de nuevo. Si el valor es verdaderos otra vez, entonces las instrucciones entre do
y done
se vuelven a ejecutar.
Esto seguirá repitiéndose hasta que la instrucción while
devuelva valor falso, o cuando el valor sea superior a 100
.
El código de scripting es parte del shell BASH, lo que significa que puedes utilizar estas instrucciones en la línea de comandos al igual que los utilizas en un script de shell. Esto puede ser útil para una instrucción como la instrucción for
, una instrucción que asignará una lista de valores de uno en uno a una variable. Esto te permite realizar un conjunto de operaciones para cada valor. Por ejemplo, ejecuta lo siguiente en la línea de comandos:
for name in /etc/passwd /etc/hosts /etc/group
do
wc $name
done
Tu pantalla debe ser similar a la siguiente:
sysadmin@localhost:~$ for name in /etc/passwd /etc/hosts /etc/group
> do
> wc $name
> done
24 30 1001 /etc/passwd
7 15 161 /etc/hosts
46 46 561 /etc/group
sysadmin@localhost:~$
Ten en cuenta que el comando wc
se ha ejecutado tres veces: una vez para /etc/passwd
, una vez para /etc/hosts
a una para /etc/group
.
A menudo, el comando seq
se utiliza en combinación con la instrucción for
. El comando seq
puede generar una lista de valores enteros, por ejemplo de 1 a 10. Por ejemplo, ejecuta lo siguiente en la línea de comandos para crear los archivos con el nombre test1
, test2
, test3
, etc. (hasta test12
):
ls
for num in `seq 1 12`
do
touch test$num
done
ls
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates check.sh num.sh
Documents Music Public Videos drive.sh
sysadmin@localhost:~$ for num in `seq 1 12`
> do
> touch test$num
> done
sysadmin@localhost:~$ ls Desktop Music Templates drive.sh test10 test2 test5 test8 Documents Pictures Videos num.sh test11 test3 test6 test9 Downloads Public check.sh test1 test12 test4 test7
sysadmin@localhost:~$
Gracias por haber leído hasta aquí, espero que te esté gustando, te invito a realizar un curso completo en la plataforma netacad, ya que de allí saque los apuntes para tenerlos más accesibles, repasar y practicar.