README.md: Se añade índice de contenido

This commit is contained in:
Tuxliban Torvalds 2023-02-13 16:58:17 -06:00
parent 608e819f07
commit 4ba3d109b6
1 changed files with 37 additions and 11 deletions

View File

@ -14,21 +14,36 @@
## **ÍNDICE**
-----
- [Suspender y reanudar un comando](#Suspender-Reanudar)
- [Uso de heredoc en lugar de múltiples echo](#Heredoc-Echo)
- [Uso de built-in en lugar de comandos externos](#Built-In)
- [Reemplazo de basename](#basename)
- [Reemplazo de dirname](#dirname)
- [Reemplazo tr](#tr)
- [Forma correcta para listar nombre de archivos en un bucle](#Bucle)
- [Usar un `glob` simple (en caso de no necesitar recursividad)](#Glob)
- [Usar `find` (si se necesita recursividad)](#Recursividad)
- [Evaluación de expresiones](#Evaluacion-Expresiones)
- [Evaluación múltiple de expresiones](#Evaluacion-Multiple)
- [Expresiones aritmétricas](#Expresion-Aritmetrica)
- [ksh y shells similares](#Shell-Similares)
-----
<a id="Suspender-Reanudar"></a>
## Suspender y reanudar un comando
Si están utilizando una consola virtual (tty) y tienen un programa ejecutándose en primer plano, no es necesario finalizar esa tarea o por ejemplo abrir otra tty para poder realizar otra tarea, sólo se necesita teclear `^Z` (control-z) para suspender temporalmente la tarea actual y estará esperando a que sea reanudado nuevamente. En este momento obtendrá un prompt de shell y podrá emitir cualquier comando.
Cuando se esté listo para continuar, puede reanudar la tarea anterior `fg %1` (*"primer plano: el primer comando en espera"*).
Cuando se esté listo para continuar, puede reanudar la tarea anterior `fg %1` *(primer plano: el primer comando en espera)*.
Si por el contrario, se quiere ejecutar el comando en segundo plano, se puede emitir también un "bg %1" ("*segundo plano: primer comando en espera*").
Si por el contrario, se quiere ejecutar el comando en segundo plano, se puede emitir también un `bg %1` *(segundo plano: primer comando en espera)*.
Por último, con el comando "jobs" es posible listar todos los comandos que se encuentran en espera.
Por último, con el comando `jobs` es posible listar todos los comandos que se encuentran en espera.
## Uso de "heredoc" en lugar de múltiples "echo"
<a id="Heredoc-Echo"></a>
## Uso de "heredoc" en lugar de múltiples `echo`
Los comandos "echo" múltiples pueden ser sustituidos por "heredoc", esto hace que el script sea más rápido y fácil de leer.
Los comandos `echo` múltiples pueden ser sustituidos por "heredoc", esto hace que el script sea más rápido y fácil de leer.
Ejemplo:
@ -69,14 +84,16 @@ Por favor, introduzca su elección:
3 - cerrar la sesión
```
En el ejemplo de `printf`, el **\** en la primera línea evita una nueva línea extra al principio del bloque de texto.
En el ejemplo de `printf`, el `\` en la primera línea evita una nueva línea extra al principio del bloque de texto.
<a id="Built-In"></a>
## Uso de built-in en lugar de comandos externos
Muchas veces, es común utilizar comandos externos como `basename`, `dirname` y `tr` por comodidad o porque no se dan cuenta de que pueden utilizar los módulos integrados de ksh.
Una ventaja añadida es que los built-in son más rápidos y requieren menos recursos del sistema porque no se genera ningún subproceso.
<a id="basename"></a>
### Reemplazo de basename:
```
fullfile="/foo_dir1/foo_dir2/archivo.txt"
@ -86,7 +103,8 @@ file=${fullfile##*/}
echo $file archivo.txt
```
## Reemplazo de dirname:
<a id="dirname"></a>
### Reemplazo de dirname:
```
fullfile="/foo_dir1/foo_dir2/archivo.txt"
@ -96,7 +114,8 @@ echo $dir
/foo_dir1/foo_dir2
```
## Reemplazo tr:
<a id="tr"></a>
### Reemplazo tr:
```
foo="EjEmPlO"
@ -113,6 +132,7 @@ echo $foo
EJEMPLO
```
<a id="Bucle"></a>
## Forma correcta para listar nombre de archivos en un bucle
No se recomienda el uso del comando `ls` en un bucle para listar el nombre de archivos debido a que el output de `ls` puede ser confuso y difícil de manipular en scripts de shell. El output de `ls` es una secuencia de caracteres que puede incluir espacios y otros caracteres especiales que no son fácilmente procesables por scripts de shell.
@ -133,6 +153,7 @@ Tampoco se puede simplemente citar la sustitución ya que eso hará que toda la
Por lo tanto, algunas las soluciones a este tipo de problemas son las siguiente:
<a id="Glob"></a>
### Usar un `glob` simple (en caso de no necesitar recursividad):
```
@ -159,6 +180,7 @@ for i in ./*.mp3; do
done
```
<a id="Recursividad"></a>
### Usar `find` (si se necesita recursividad)
```
@ -177,6 +199,7 @@ done < <(find . -type f -name '*.xyz' -print0)
La ventaja aquí es que *<comando>* (técnicamente todo el cuerpo del bucle while) se ejecuta en el shell actual. Por lo tanto, es posible establecer variables y hacer que persistan una vez finalizado el bucle.
<a id="Evaluacion-Expresiones"></a>
## Evaluación de expresiones
Cuando la variable contiene espacios en blanco internos, entonces se dividirá en palabras separadas antes de que el comando `[` (test) pueda leerlo. Por ejemplo:
@ -203,9 +226,10 @@ foo="texto de ejemplo"
[[ $foo == "texto de ejemplo" ]] && print "$foo"
```
Como se puede observar, no es necesario citar la variable que se ubica del lado izquierdo de la evaluación (==) dentro de `[[ ]]` porque con esta versión mejorara de `[` no se dividen ni agregan palabras, incluso las variables en blanco se manejarán correctamente. Como se puedo observar, para hacer que la cadena de la derecha se interprete literalmente, hay que citarla si se utilizan caracteres que tienen un significado especial como por ejemplo **!, #, $**, etc..
Como se puede observar, no es necesario citar la variable que se ubica del lado izquierdo de la evaluación (==) dentro de `[[ ]]` porque con esta versión mejorara de `[` no se dividen ni agregan palabras, incluso las variables en blanco se manejarán correctamente. Como se puede observar, para hacer que la cadena de la derecha se interprete literalmente, hay que citarla si se utilizan caracteres que tienen un significado especial como por ejemplo **!, #, $**, etc..
<a id="Evaluacion-Multiple"></a>
## Evaluación múltiple de expresiones
Otro error que se comete cuando comenzamos a crear nuestros propios scripts es que puede suceder que queramos utilizar `&&` dentro `[`. Al realizar esto nuestro shell nos indicará que hay un error de sintaxis y por lo tanto, nuestro script no podrá ejecutarse correctamente.
@ -227,6 +251,7 @@ Código correcto:
[[ -e "$foo" && "$foo" = "ejemplo" ]] && <comandos>
```
<a id="Expresion-Aritmetrica"></a>
## Expresiones aritmétricas
Si se desea comparar números por valor evite usar `< >` ya que estos son utilizados para comparaciones de cadenas o en el peor de los casos, como redirección de la salida estándar. Tampoco utilice `=> =<`
@ -240,7 +265,7 @@ if [ "$foo" > 3 ]; then
fi
```
Para corregir el error arriba mencionado, utilice los operadores de comparación numérica `-eq -gt -ge -lt -le` que corresponden a *igual que, mayor que, mayor o igual que, menor que* y *menor o igual que*
Para corregir el error arriba mencionado, utilice los operadores de comparación numérica `-eq -gt -ge -lt -le` que corresponden a *igual que, mayor que, mayor o igual que, menor que* y *menor o igual que* respectivamente.
Código correcto
@ -252,6 +277,7 @@ if [ "$foo" -ge 3 ]; then
fi
```
<a id="Shell-Similares"></a>
### ksh y shells similares
Si solo desea hacer una comparación numérica (o cualquier otra aritmética de shell), es mucho mejor usar `(( ))` en lugar de `[[ ]]`