En este tutorial, vamos a hablar sobre las secuencias de comandos de shell y cómo crear su primera secuencia de comandos de shell. En general, se denominan scripts de shell, pero los llamaremos scripts de Bash porque usaremos Bash entre los otros shells de Linux.
Hay zsh, tcsh, ksh y otros shells.
En las publicaciones anteriores, vimos cómo usar el shell Bash y cómo usar los comandos de Linux.
El concepto de un script de Bash es ejecutar una serie de comandos para realizar su trabajo.
Para ejecutar varios comandos en un solo paso desde el shell, puede escribirlos en una línea y separarlos con punto y coma.
pwd ; whoami
¡¡Este es un script de Bash!!
Primero se ejecuta el comando pwd, que muestra el directorio de trabajo actual, luego se ejecuta el comando whoami para mostrar los usuarios conectados actualmente.
Puede ejecutar varios comandos tanto como desee, pero con un límite. Puede determinar sus argumentos máximos usando este comando.
getconf ARG_MAX
Bueno, ¿qué hay de poner los comandos en un archivo, y cuando necesitamos ejecutar estos comandos, ejecutamos solo ese archivo? Esto se llama secuencia de comandos Bash.
Primero, crea un nuevo archivo usando el comando táctil. Al comienzo de cualquier script Bash, debemos definir qué shell usaremos porque hay muchos shells en Linux, Bash shell es uno de ellos.
Shebang de secuencias de comandos de Shell
La primera línea que escribe al escribir un script de Bash es el (#!) seguido del shell que usará.
#! <===este signo se llama shebang.
#!/bin/bash
Si usa el signo de libra (#) delante de cualquier línea en su script de shell, esta línea se convertirá en un comentario, lo que significa que no se procesará, pero la línea anterior es un caso especial. Esta línea define qué shell usaremos, que es Bash shell en nuestro caso.
Los comandos de shell se ingresan uno por línea así:
#!/bin/bash # This is a comment pwd whoami
Puede escribir varios comandos en la misma línea, pero debe separarlos con punto y coma, pero es preferible escribir comandos en líneas separadas; esto hará que sea más fácil de leer más adelante.
Establecer permiso de script
Después de escribir su script de shell, guarde el archivo.
Ahora, configure ese archivo para que sea ejecutable; de lo contrario, le dará permiso denegado. Puede revisar cómo establecer permisos usando el comando chmod.
chmod +x ./myscript
Luego intente ejecutarlo simplemente escribiéndolo en el shell:
./myscript
Y sí, se ejecuta.
Haz tu primer script Bash
Como sabemos por otras publicaciones, la impresión de texto no se realiza con
echo
comando.
Edite su archivo y escriba esto:
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
Mira la salida:
¡Perfecto! Ahora podemos ejecutar comandos y mostrar texto:
echo
Si no conoce el comando echo o cómo editar un archivo, le recomiendo que consulte los artículos anteriores sobre los comandos básicos de Linux.
Uso de variables
Las variables le permiten almacenar información para usarla en su script.
Puede definir dos tipos de variables en su script de shell:
- Variables de entorno
- Variables de usuario
Variables de entorno
A veces necesitas interactuar con las variables del sistema; puede hacer esto usando variables de entorno.
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
Observe que colocamos la variable de sistema $HOME entre comillas dobles e imprime la variable de inicio correctamente.
¿Qué pasa si queremos imprimir el signo de dólar en sí?
echo "I have $1 in my pocket"
Como la variable $1 no existe, no funcionará. Entonces, ¿cómo superar eso?
Puede usar el carácter de escape, que es la barra invertida \ antes del signo de dólar de esta manera:
echo "I have \$1 in my pocket"
¡¡Ahora funciona!!
Variables de usuario
Además, puede configurar y usar sus variables personalizadas en el script.
Puede llamar a las variables de usuario de la misma manera que esta:
#!/bin/bash # User variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
chmod +x myscript ./myscript
Sustitución de comandos
Puede extraer información del resultado de un comando utilizando la sustitución de comandos.
Puede realizar la sustitución de comandos con uno de los siguientes métodos:
- El carácter de acento grave (`).
- El formato $().
Asegúrese de que cuando escriba el carácter de acento grave, no sean las comillas simples.
Debe encerrar el comando con dos acentos graves como este:
mydir=`pwd`
O al revés:
mydir=$(pwd)
Así que el guión podría ser así:
#!/bin/bash mydir=$(pwd) echo $mydir
Puede almacenar la salida del comando en la variable mydir.
Cálculo matemático
Puede realizar cálculos matemáticos básicos utilizando el formato $(( 2 + 2 )):
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
Así de fácil.
sentencia si-entonces
Sus scripts de shell necesitarán declaraciones condicionales. Como si el valor es menor que 10, haz esto, haz lo otro. Puedes imaginar la lógica que quieras.
La estructura más básica de la declaración si-entonces es así:
si mando; entonces
haz algo
fi
y aquí hay un ejemplo:
#!/bin/bash if whoami; then echo "It works" fi
Desde el
whoami
devolverá mi usuario, por lo que la condición será verdadera e imprimirá el mensaje.
Profundicemos más y usemos otros comandos que conocemos.
Comprobar si existe un usuario
Tal vez buscando un usuario específico en el archivo del usuario
/etc/passwd
y si existe constancia me lo dices en un mensaje.
#!/bin/bash user=likegeeks if grep $user /etc/passwd; then echo "No such a user $user" fi
Usamos el
/etc/passwd
expediente. Puede consultar nuestro tutorial sobre el comando grep.
Si el usuario existe, el script de shell imprimirá el mensaje.
¿Qué pasa si el usuario no existe? El script saldrá de la ejecución sin decirnos que el usuario no existe. Bien, mejoremos más el guión.
sentencia if-then-else
La declaración if-then-else toma la siguiente estructura:
si mando; entonces
haz algo
más
haz otra cosa
fi
Si el primer comando se ejecuta y devuelve cero, lo que significa éxito, no ejecutará los comandos después de la instrucción else; de lo contrario, si la instrucción if devuelve un valor distinto de cero; lo que significa que la condición de la declaración falla, en este caso, el shell ejecutará los comandos después de la declaración else.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
Lo estamos haciendo bien hasta ahora, sigue moviéndote.
Ahora, ¿qué pasa si necesitamos más declaraciones else?
Bueno, eso es fácil, podemos lograrlo anidando sentencias if como esta:
si condición1; entonces
comandos
elif condición2; entonces
comandos
fi
Si el primer comando devuelve cero; significa éxito, ejecutará los comandos posteriores, de lo contrario, si el segundo comando devuelve cero, ejecutará los comandos posteriores, de lo contrario, si ninguno de estos devuelve cero, ejecutará solo los últimos comandos.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" elif ls /home; then echo "The user doesn’t exist" fi
Puede imaginar cualquier escenario, tal vez si el usuario no existe, cree un usuario usando
useradd
ordenar o hacer cualquier otra cosa.
Combinar pruebas
Puede combinar múltiples pruebas usando el comando AND (&&) u OR (||).
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] && [ -n $name ]; then echo "The name exists and the folder $dir exists." else echo "One test failed" fi
Este ejemplo devolverá verdadero solo si ambas pruebas tuvieron éxito; de lo contrario, fallará.
Además, puede usar OR (||) de la misma manera:
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] || [ -n $name ]; then echo "Success!" else echo "Both tests failed" fi
Este ejemplo devolvería el éxito si uno o ambos tuvieran éxito.
Solo fallaría si ambos fallaran.
Comparaciones numéricas
Puede realizar una comparación numérica entre dos valores numéricos mediante comprobaciones de comparación numérica como esta:
número1 -eq número2 Comprueba si el número1 es igual al número2.
número1 -ge número2 Comprueba si el número1 es mayor o igual que el número2.
número1 -gt número2 Comprueba si el número1 es mayor que el número2.
número1 -le número2 Comprueba si el número1 es menor o igual que el número2.
número1 -lt número2 Comprueba si el número1 es menor que el número2.
número1 -ne número2 Comprueba si número1 no es igual a número2.
Como ejemplo, probaremos uno de ellos, y el resto es igual.
Tenga en cuenta que la declaración de comparación está entre corchetes, como se muestra.
#!/bin/bash num=11 if [ $num -gt 10]; then echo "$num is bigger than 10" else echo "$num is less than 10" fi
El número es mayor que diez, por lo que ejecutará la primera instrucción e imprimirá el primer eco.
Comparaciones de cadenas
Puede comparar cadenas con una de las siguientes formas:
cadena1 =cadena2 Comprueba si la cadena1 es idéntica a la cadena2.
cadena1 !=cadena2 Comprueba si la cadena1 no es idéntica a la cadena2.
string1
string1> string2 Comprueba si string1 es mayor que string2.
-n cadena1 Comprueba si la cadena1 es más larga que cero.
-z string1 Comprueba si string1 tiene longitud cero.
Podemos aplicar una comparación de cadenas a nuestro ejemplo:
Una nota engañosa sobre mayor que y menor que para las comparaciones de cadenas, DEBEN ser escapado con la barra invertida porque si usa solo el símbolo mayor que, muestra resultados incorrectos.
Así que deberías hacerlo así:
Se ejecuta, pero da esta advertencia:
Para arreglarlo, envuelva $vals con una comilla doble, obligándolo a permanecer como una cadena como esta:
Una nota crítica sobre mayor que y menor que para comparaciones de cadenas. Consulte el siguiente ejemplo para comprender la diferencia:
como geeks
Me gusta geeks
La condición de prueba considera las letras minúsculas más grandes que las mayúsculas.
A diferencia del comando ordenar, que hace lo contrario.
La condición de prueba se basa en el orden ASCII.
Mientras que el comando de clasificación se basa en los órdenes de numeración de la configuración del sistema.
Puede comparar y buscar archivos usando los siguientes operadores:
-d my_file Comprueba si es una carpeta.
-e mi_archivo Comprueba si el archivo está disponible.
-f my_file Comprueba si es un archivo.
-r my_file Comprueba si es legible.
mi_archivo – nt my_file2 Comprueba si my_file es más reciente que mi_archivo2.
mi_archivo – ot my_file2 Comprueba si my_file es antiguo que mi_archivo2.
-O my_file Comprueba si el propietario del archivo y el usuario registrado coinciden.
-G my_file Comprueba si el archivo y el usuario registrado tienen un grupo idéntico.
Como dan a entender, nunca los olvidarás.
Escojamos uno de ellos y tomémoslo como ejemplo:
No vamos a escribir cada uno de ellos como ejemplo. Simplemente escriba la comparación entre los corchetes tal como está y complete su secuencia de comandos normalmente.
Hay algunas otras funciones avanzadas si-entonces, pero hagámoslo en otra publicación.
Eso es por ahora. Espero que lo disfrutes y sigas practicando cada vez más.
Gracias.#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
echo "The user $user is the current logged in user"
fi
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
./myscript: line 5: [: too many arguments
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
sort myfile
sort
sort
Comparaciones de archivos
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
echo "Directory $mydir exists"
cd $mydir
ls
else
echo "NO such file or directory $mydir"
fi