Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Programación shell en Unix/Linux
  3. Las bases de la programación shell
Extrait - Programación shell en Unix/Linux ksh, bash, estándar POSIX (con ejercicios corregidos) (5ª edición)
Extractos del libro
Programación shell en Unix/Linux ksh, bash, estándar POSIX (con ejercicios corregidos) (5ª edición) Volver a la página de compra del libro

Las bases de la programación shell

Presentación

Este capítulo presenta las funcionalidades que componen los conceptos básicos de la programación shell. Cuando los scripts que se dan como ejemplo no son compatibles con el intérprete utilizado por el lector, invitamos a este último a recuperar los ejemplos desde el espacio de descarga, que se proporcionan para diferentes shell presentados en este libro.

Las variables de usuario

El shell permite definir o redefinir variables que condicionan el entorno de trabajo del usuario. También es posible definir otras variables, llamadas variables de usuario, que permitirán almacenar información que será necesaria durante la ejecución de un script.

1. Poner nombre a una variable

A continuación se muestran las reglas que hay que seguir para dar un nombre a las variables:

  • El primer carácter pertenece al conjunto [a-zA-Z_].

  • Los caracteres siguientes pertenecen al conjunto [a-zA-Z0-9_].

2. Definir una variable

Una variable está definida desde el momento en que ha sido inicializada. El contenido de una variable se considera por el shell como un conjunto de caracteres.

a. Asignar un valor a una variable

Ejemplo

$ var1=palabra1  
$ echo $var1  
palabra1 
$ 

No hay que poner espacios alrededor del símbolo de la asignación: en el ejemplo siguiente, el shell interpreta var1 como el comando que se ha de ejecutar, = y palabra1 como los dos argumentos del comando var1. Dicho de otra manera, no interpreta el símbolo = como símbolo de asignación.

$ var1 = palabra1  
ksh: var1: not found 
$ 

b. Asignar un valor con al menos un espacio

El carácter de espacio tiene que estar protegido, ya que es un carácter especial del shell (separador de palabras en la línea de comandos).

Ejemplo

$ var2='palabra1 palabra2 palabra3' #CORRECTO 
$ echo $var2  
palabra1 palabra2 palabra3 
$ var2=palabra1 palabra2 palabra3 #INCORRECTO 
ksh: palabra2: not found 
$ 

c. Variable indefinida

Una variable que nunca se ha inicializado está vacía.

Ejemplo

$ echo $vacia  
 
$ 

d. Borrar la definición de una variable

El comando interno unset permite hacer que una variable sea indefinida. La opción -v (opción POSIX: -v como variable) no está documentada en el manual del ksh88, pero funciona.

posix

ksh93

bash

$ unset -v variable 

ou

bourne

posix

ksh(88 et 93)

bash

$ unset variable 

Ejemplo

Definición de una variable var:

$ var=12  
$ echo $var  
12 

Esta variable aparecerá en la lista de variables definidas a nivel de shell:

$ set | grep var  
var=12 

Se borra la definición de la variable:

$ unset var 

La variable está indefinida:

$ echo $var  
 
$ set | grep var  
$ 

e. Aislar el nombre...

Sustitución de comandos

Los caracteres de sustitución permiten remplazar un comando por el resultado de su ejecución. Este mecanismo se utiliza para insertar en la línea de comandos Unix el resultado de otro comando.

Sintaxis reciente

posix

ksh

bash

comando argumento1 $(comando) ... argumenton 

Sintaxis original con apóstrofes inversos (anti-comllas)

bourne

posix

ksh

bash

comando argumento1 `comando` ... argumenton 

Primer ejemplo

Los comandos uname -n y logname son remplazados por su resultado antes de la ejecución del comando echo:

Sintaxis reciente (bash, ksh, posix):

$ echo Está conectado a la máquina $(uname -n) 
y usted es $(logname) 
Está conectado a la máquina rumba y 
usted es cristina 

Sintaxis original:

$ echo Está conectado a la máquina `uname -n` y usted es `logname` 
Está conectado a la máquina rumba y usted es cristina 

Segundo ejemplo

Inicialización de una variable miuid con el uid del usuario cristina:

$ grep cristina /etc/passwd 
cristina:x:2025:2000::/home/cristina:/bin/bash 
$ 
$ grep cristina /etc/passwd | cut -d: -f3  
2025 
$ 
$ miuid=$(grep cristina /etc/passwd | cut -d: -f3)  
o 
$ monuid=`grep cristina /etc/passwd | cut -d: -f3` 
$ 
$ echo $miuid  
2025 
$ 

Caracteres de protección

Los caracteres de protección sirven para hacer perder el significado a los caracteres especiales del shell. Existen tres juegos de caracteres, cada uno con funcionalidades propias.

1. Los apóstrofes (comillas simples)

Los apóstrofes (o comillas simples) eliminan el significado a todos los caracteres especiales del shell. Los apóstrofes deben ser un número par en la línea de comandos.

Los apóstrofes simples no se protegen a sí mismos.

Ejemplos

La variable $HOME se sustituye por su valor:

$ echo $HOME 
/home/cristina 

El carácter $ pierde su significado especial:

$ echo '$HOME' 
$HOME 

El carácter * se sustituye por los nombres de archivo del directorio actual:

$ echo * 
f1 f2 f3 

El carácter * pierde su significado especial:

$ echo '*' 
* 

El shell espera encontrar un nombre de archivo tras una redirección:

$ echo > 
bash: syntax error near unexpected token `>' 

El carácter > pierde su significado especial:

$ echo '>' 
> 

El shell ejecuta el comando logname y lo remplaza por su resultado:

$ echo Hola $(logname) 
Hola cristina 

La secuencia de caracteres $( ) pierde su significado especial:

$ echo 'Hola $(logname)' 
Hola $(logname) 
$ 

Protección de múltiples caracteres especiales:

$ echo '* ? > < >> << | $HOME $(logname)...

Recapitulación de los caracteres especiales

Esta tabla agrupa los caracteres especiales del shell vistos anteriormente:

Caracteres

Significado

espacio - tabulación - salto de línea

Separadores de palabras en la línea de comandos

&

Segundo plano

| << < > >>

Tubería y redirecciones

() y {}

Agrupación de comandos

;

Separador de comandos

* ? [ ] ?() +() *() !() @()

Caracteres de generación de nombres de archivo

$ y ${ }

Valor de una variable

`` $()

Sustitución de comandos

’ ’ " " \

Caracteres de protección

Interpretación de una línea de comandos

Los caracteres especiales del shell se interpretan en un orden determinado:

Secuencia de interpretación

Comando interno

Comando externo

1. Aislamiento de las palabras separadas por los caracteres espacio, tabulación y salto de línea

2. Tratamiento de los caracteres de protección (’ ’ , " ", \)

3. Sustitución de las variables ($)

4. Sustitución de los comandos (`` $())

5. Sustitución de los caracteres de generación de nombres de archivo (*, ?, [] etc.)

Realizado por el shell actual

6. Tratamiento de las tuberías y redirecciones

7. Ejecución del comando

shell actual

shell hijo

Ejemplo

images/syntaxe.png

Escritura y ejecución de un script en shell

1. Definición

Un script en shell es un archivo de texto que contiene los comandos Unix internos o externos, así como palabras clave del shell.

No hay ningún convenio establecido para el nombre de scripts de shell. El nombre de un archivo script de shell puede tener extensión, pero no es obligatorio. Sin embargo, generalmente se usa la extensión ".sh" (incluso si el script no se interpreta con el ejecutable llamado "sh").

Para mejorar la legibilidad, los nombres de los scripts utilizados en este capítulo tendrán una extensión en relación con su compatibilidad: .bash, .ksh, .sh, .posix, .bourne, etc.

Ejemplo

A continuación se muestra el script primero.sh:

$ nl primero.sh 
     1 pwd 
     2 cd /tmp 
     3 pwd 
     4 ls 
$ 

Ejecución del script:

$ ksh primero.sh 
/home/cristina 
/tmp 
f1 f2 f3 
$ 

Los comandos se ejecutan secuencialmente.

2. Ejecución de un script por un shell hijo

En la mayoría de los casos, los scripts tienen que ejecutarse a través de un shell hijo como intermediario. Esto tiene como ventaja la no modificación del entorno del shell actual. Para ejecutar un script en shell, existen tres métodos que producen un resultado equivalente.

Primer método

$ ksh primero.sh 

Este ha sido el método usado anteriormente. Se invoca al comando ksh pidiéndole la interpretación del script primero.sh.

En este caso, el permiso de lectura sobre el archivo primero.sh es suficiente:

$ ls -l primero.sh  
-rw-r--r--    1 cristina curso       19 nov 15 19:16 primero.sh 

Segundo método

$ ksh < primero.sh 

El ksh es un programa que lee su entrada estándar; por tanto, es posible conectarle el archivo...

Variables reservadas del shell

En un script, una serie de variables reservadas son accesibles en modo lectura. Estas variables se inicializan por parte del shell y ofrecen información de diversa índole.

1. Los parámetros posicionales

bourne

posix

ksh

bash

Los scripts en shell son capaces de recuperar los argumentos pasados por línea de comandos con la ayuda de variables especiales, llamadas parámetros posicionales

  • $# representa el número de argumentos recibidos por el script.

  • $0 representa el nombre del script.

  • $1 representa el valor del primer argumento, $2 el valor del segundo y es así hasta $9, que representa el valor del noveno argumento. Ksh y bash permiten usar las variables especiales ${10}, ${11}, etc. Las llaves son obligatorias cuando el nombre de la variable contiene más de una cifra.

  • $* y $@ representan la lista de todos los argumentos (la diferencia entre $* y $@ se presenta en el capítulo Aspectos avanzados de la programación shell - Comparación de las variables $* y $@).

Ejemplo

A continuación, un script que muestra el valor de cada parámetro posicional:

$ vi miscript.sh 
echo "Este script ha recibido $# argumentos" 
echo "El nombre del script es: $0" 
echo "Mi 1º argumento es     : $1" 
echo "Mi 2º argumento es     : $2" 
echo "Mi 3º argumento es     : $3" 
echo "La lista de todos mis argumentos: $*" 
$ chmod u+x miscript.sh 

Llamada de miscript.sh con seis argumentos (ver figura 4):

$ miscript.sh f1 f2 f3 f4 /tmp/fic.txt 123 
Este script ha recibido 6 argumentos 
El nombre del script es: miscript.sh 
Mi 1º argumento es     : f1 
Mi 2º argumento es     : f2 
Mi 3º argumento es     : f3 
La lista de todos mis argumentos: f1 f2 f3 f4 /tmp/fic.txt 123 
images/04ri04.png

Figura 4: Pasar seis argumentos por línea de comandos

Llamada de miscript.sh con tres argumentos (ver figura 5):

$ miscript.sh 12 + 24 
Este script ha recibido 3 argumentos 
El nombre del script es: miscript.sh 
Mi 1º argumento es     : 12 
Mi 2º argumento es     : + 
Mi 3º argumento es     : 24 
La lista de todos mis argumentos: 12 + 24 
images/04ri05.png

Figura 5: Pasar tres argumentos por línea...

El comando read

1. Sintaxis

Primera sintaxis

bourne

posix

ksh

bash

read var1 
read var1 var2 ... 

Otras sintaxis

Estas sintaxis particulares (no portables) permiten visualizar un mensaje:

ksh

read var?"Introducir un valor: " 

bash

read -p " Introducir un valor: " var 

2. Lecturas del teclado

El comando read lee su entrada estándar y asigna las palabras leídas en la(s) variable(s) cuyo nombre se pasa como argumento. La lista de caracteres separadores de palabras usados por read se almacenan en la variable de entorno IFS (contiene por defecto los caracteres espacio, tabulación (\t) y salto de línea (\n)).

Ejemplos

La palabra introducida se almacena en la variable var1:

$ read var1 
hola 
$ echo $var1 
hola 

Todas las palabras introducidas se almacenan en la variable var1:

$ read var1 
hola a todo el mundo 
$ echo $var1 
hola a todo el mundo 

La primera palabra se almacena en var1, la segunda en var2:

$ read var1 var2  
Hasta luego  
$ echo $var1  
Hasta 
$ echo $var2  
luego 

La primera palabra se almacena en var1 y el resto de la línea en var2:

$ read var1 var2  
Hasta luego a todo el mundo  
$ echo $var1  
Hasta 
$ echo $var2  
luego a todo el mundo 

La palabra se almacena en var1, y var2 se queda vacía:

$ read var1 var2  
Gracias 
$ echo $var1  
Gracias 
$ echo $var2  
 
$ 

Especificar un mensaje...

Ejecución de verificaciones

1. Introducción

Hay dos comandos que permiten efectuar las pruebas:

  • El comando histórico del Bourne Shell [ ] también puede ser usado bajo el nombre test. Es compatible con los shells Bourne, ksh y bash y cumple el estándar POSIX.

  • El comando [[ ]] disponible en ksh y bash. Se trata de un subconjunto del comando original [ ] del Bourne Shell; sin embargo, con algunas incompatibilidades. Aunque el comando, [[ ]] no cumple el estándar POSIX, corrige los errores de [ ] e incluye funcionalidades adicionales interesantes. Presentaremos este comando en primer lugar.

2. El comando [[ ]]

ksh

bash

Este comando permite hacer verificaciones de archivos, de cadenas de caracteres y de números. Devuelve el código 0 o 1 (verdadero o falso), que el usuario puede consultar mostrando el valor de $? o explotar las estructuras de control if, while, until y los operadores lógicos del shell && y ||.

a. Sintaxis

[[expresión]] 

o

[[ expresión ]] 

Los espacios que rodean la expresión presente dentro de los corchetes, son opcionales. 

Principio de funcionamiento

/etc/passwd es un archivo ordinario (opción -f), por lo que el comando devuelve verdadero:

$ [[ -f  /etc/passwd ]]  
$ echo $?   
0 

Utilización de la estructura de control if

La estructura de control if se presenta aquí brevemente para ilustrar el uso concreto del comando [[ ]].

if [[ -f  /etc/passwd ]]  
then  
  echo "El archivo /etc/passwd es un archivo ordinario"  
else  
  echo " El archivo /etc/passwd no es un archivo ordinario"  
fi 

El principio de la estructura de control if es el siguiente: se lanza el comando situado a la derecha del if (aquí [[-f /etc/passwd ]]). Si el código de devolución del comando es verdadero ($? es 0), se ejecuta la primera parte del if (que es el caso aquí). De lo contrario ($? es mayor que 0), es la segunda parte la que se ejecutará.

Las opciones para el comando [[ ]] se muestran a continuación. En aras de la claridad, la mayoría de los ejemplos utilizan el comando [[ ]], seguido directamente por la visualización del código de retorno.

b. Verificación de archivos

Expresión

Código de retorno

Verificaciones sobre la existencia y el tamaño...

Los operadores del shell

Estos operadores permiten ejecutar o no un comando en función del código de retorno de otro comando. La evaluación se realiza de izquierda a derecha.

No hay que confundir los operadores del shell (&& y ||) que realizan una operación lógica entre dos comandos Unix, con los operadores del comando [[ ]] (&& y ||) que son internos a este último.

Operador

Significado

&&

Y lógico

||

O lógico

!

Negación (posix, ksh93, bash. No documentada en ksh88 pero funciona)

1. Evaluación del operador &&

Sintaxis

comando1 && comando2 
  • El segundo comando se ejecuta únicamente si el primer comando devuelve el código verdadero.

  • La expresión global es verdadera si los dos comandos devuelven verdadero.

Ejemplos

El directorio /tmp/svg no existe; por lo tanto, el comando cd no se ejecuta:

$ ls -d /tmp/svg 
/tmp/svg: No such file or directory 
$ pwd 
/export/home/cristina 
$ [[ -d /tmp/svg ]] && cd /tmp/svg 
 
$ echo $?        # Código del comando [[ ]]  
1 
$ pwd  
/export/home/cristina 

El directorio /tmp/svg existe; por lo tanto, el comando cd se ejecuta:

$ mkdir /tmp/svg  
$ [[ -d /tmp/svg ]] && cd /tmp/svg  
$ pwd  
/tmp/svg 
$ 

Estas acciones también pueden implementarse con la estructura de control if.

$ pwd  
/export/home/cristina ...

Aritmética

Los shells permiten realizar cálculos de forma nativa con números enteros. La aritmética de los enteros se presenta a través de los comandos (( )) y let, específicos de ksh y bash. A continuación, se trata el comando original expr del Bourne shell.

1. El comando (( ))

ksh

bash

a. Sintaxis

((expresión_aritmética)) 

o

(( expresión _aritmética )) 

b. Operadores

Reutiliza una gran parte de los operadores del lenguaje C.

Operadores

Significado

Operadores aritméticos

num1 + num2

Suma

num1 - num2

Resta

num1 * num2

Multiplicación

num1 / num2

División

num1 % num2

Módulo

num1++

Incrementa num1 en 1 (bash/ksh93)

num1--

Disminuye num1 en 1 (bash/ksh93)

Operadores que trabajan sobre los bits

~num1

Complemento a 1

num1 >> num2

Desplaza en num1num2 bits a la derecha

num1 << num2

Desplaza en num1num2 bits a la izquierda

num1 & num2

Y bit a bit

num1 | num2

O bit a bit

num1 ^ num2

O exclusivo bit a bit

Operadores de comparación

num1 > num2

Verdadero si num1 es estrictamente superior a num2

num1 >= num2

Verdadero si num1 es superior o igual a num2

num1 < num2

Verdadero si num1 es estrictamente inferior a num2

num1 <= num2

Verdadero si num1 es inferior o igual a num2

num1 == num2

Verdadero si num1 es igual a num2

num1 != num2

Verdadero si num1 es distinto a num2

Operadores lógicos

!num1

Inverso del valor de verdad de num1

&&

Y

||

O

Operadores diversos

-num1

Opuesto de num1

num1 = expresión

Asignación

(expresión)

Agrupación

num1 binop= num2

binop representa uno de los operadores siguientes: +, -, *, /, %, >>, <<, &, |, ^. Esta escritura es equivalente a: num1 = num1 binop num2

Ejemplos

Añadir 10 a la variable x:

$ x=10   
$ (( x = $x + 10 ))   
$ echo $x   
20 

Los espacios no son obligatorios:

$ x=10   
$ ((x=$x+10))   
$ echo $x   
20 

El símbolo $ se puede omitir:

$ x=10   
$ ((x=x+10))   
$ echo $x   
20   
$ 

Una escritura más:

$ x=10   
$ ((x+=10))        # Equivalente a ((x=x+10))   
$ echo $x   
20   
$ 

El script egal.sh indica si dos números son iguales:

$ nl egal.sh    
    1...

Sustitución de expresiones aritméticas

bourne

posix

ksh

bash

Los caracteres de sustitución de comandos se trataron en la sección Sustitución de comandos de este capítulo.

Los caracteres especiales del shell $(( )) permiten sustituir una expresión aritmética por su resultado. Estos caracteres se pueden encerrar entre comillas.

Sintaxis

posix

ksh

bash

 

comando argumento1 $((expresión-aritmética)) ... argumenton 

Ejemplo

$ x=2  

Visualizar el valor de x+1, sin modificar el valor de la variable (que siempre vale 2):

$ echo $((x+1)) 
3 

Asignaciones:

$ i=1 
$ i=$(( $i * 100 ))        # o    i=$(( i * 100 )) 
$ echo $i 
100 

Equivalente a:

$ i=`expr $i \* 100`        o    i=$(expr $i \* 100) 

Modificar y mostrar la variable x:

$ echo "x  
3 

No hay que confundir con el comando (( )), que no muestra nada:

$ x=2  
$ ((x=$x+1))    modificación de la variable x  
$ echo $x  

No confundir (( )) y $(( )). (( )) es un comando interno del shell, y $(( )) son caracteres especiales del shell del mismo tipo que `` o $().

Aritmética de punto flotante

Solo el ksh93 ofrece una funcionalidad nativa para trabajar con números de punto flotante.

1. ksh93

El comando typeset permite declarar un número de punto flotante con la precisión deseada.

Sintaxis

typeset -Fprecisión  var1[=val1] [ var2=[val2] ... ] 

Ejemplo

$ typeset -F3 iva=0.21 
$ typeset -F2 noimp=153 
$ typeset -F2 monto Iva 
$ (( montoIva=$((noimp * $iva )) 
$ echo $monto Iva 
32.2                        # redondeo de 32.13 

2. Otros shells

El comando bc permite realizar cálculos y se comporta como un filtro. También es posible utilizar el comando awk (nawk en algunas plataformas), que puede efectuar cálculos sobre números de punto flotante.

Ejemplo

Envío de una expresión aritmética al comando bc:

$ noimp=153  
$ iva=0.21  
$ echo "$noimp * $iva" | bc  
32.13 

Envío de dos parámetros al comando awk (ver capítulo El lenguaje de programación awk):

$  echo "$noimp $iva" | awk '{ print $1 * $2 }' 
32.13 

La misma operación realizada con formato:

$  echo "$noimp $iva" | awk '{ printf("%.2f\n", $1 * $2) }' 
32.2 

Preste atención a los redondeos de los valores límite, tanto con typeset como con printf: por ejemplo...

Corrección de un script

El shell ofrece algunas opciones que permiten corregir scripts de shell.

1. Opción -x

La opción -x permite visualizar los comandos que son ejecutados, es decir, después del tratamiento de los caracteres especiales del shell.

Primera sintaxis

bourne

posix

ksh

bash

Activar la opción:

set -x 

Desactivar la opción:

set +x 

Segunda sintaxis

posix

ksh

bash

Activar la opción:

set -o xtrace 

Desactivar la opción:

set +o xtrace 

Tercera sintaxis

Invocar el shell intérprete con la opción -x:

$ bash -x script 

Ejemplo

He aquí, el script existe archivo.sh, en el cual se ha introducido un error. El desarrollador del script ha escrito, por descuido, arch en vez de $arch (línea 5):

$ nl existe_archivo.sh 
    1  #! /usr/bin/bash 
    2  # compatibilidad del script: bash 
 
    3  echo -n "Nombre del archivo a visualizar: " # específico bash 
    4  read arch 
    5  if [[ -f arch ]] ; then 
    6    echo "$arch existe" 
    7 else 
    8    echo "$arc no existe" 
    9  fi 

Ejecución del script sin corrección. ¡Parece sorprendente (¿o perturbador?) que el archivo /etc/passwd no se haya encontrado!...

Las estructuras de control

1. if

La estructura de control if permite realizar verificaciones. El comando situado tras la palabra if se ejecuta. En función del código devuelto por este, el shell orienta el flujo de ejecución en la parte then si el comando ha devuelto verdadero ($? vale 0) y en la parte else si el comando ha devuelto falso ($? > 0). Si el comando ha devuelto falso y no tiene parte else, el flujo de ejecución continúa con el primer comando situado bajo fi.

Primera sintaxis

if comando1 
then 
  comando2 
  comando3 
  ... 
else  
  comando4 
  ... 
fi 

Segunda sintaxis

La parte else es opcional.

if comando1 
then 
  comando2 
  comando3 
  ... 
fi 

Tercera sintaxis

Es posible usar la palabra clave elif, que significa sino si.

if comando1 
then 
  comando2 
  ...  
elif comando3 
then  
  comando4 
  ... 
else  
  comando5 
  ... 
fi 

La palabra clave fi representa el cierre del if. La palabra clave elif no tiene cierre.

Otras sintaxis

La palabra clave then puede colocarse en la primera línea con la condición de usar un ; para poder separar el comando.

if comando1 ; then 
  comando2 
  ... 
fi 

También es posible anidar estructuras de control. La sintaxis mostrada a continuación es equivalente a la sintaxis elif presentada con anterioridad.

if comando1 
then  
  comando2 
  ... 
else  
  if comando3 
  then  
    comando4 
    ...  
  else  
    comando5 
    ... 
  fi 
fi 

Primer ejemplo

El script existe_usuario.sh recibe como argumento un nombre de usuario. El script muestra por pantalla si el usuario existe o no en el sistema:

$ nl existe_usuario.sh  
    1  #! /bin/bash  
 
    2  # compatibilidad del script: ksh, bash  
  
    3  if [[ $# -ne 1 ]] ; then   
    4    echo "Número incorrecto de argumentos"  ...

Ejercicios

1. Variables, caracteres especiales

a. Ejercicio 1: variables

1.

Defina una variable que contenga su nombre. Muestre esta variable.

2.

Defina una variable que contenga su nombre, un espacio y, después, su apellido. Muestre esta variable.

3.

Elimine las dos variables (dejándolas indefinidas).

b. Ejercicio 2: variables

Defina una variable que contenga su apellido, y otra que contenga su nombre. Utilizando un solo echo, muestre las dos variables, separadas por un carácter de subrayado (apellido_nombre).

c. Ejercicio 3: sustitución de comando

1.

En un solo comando, muestre la fecha actual:

Hoy es jue 18 ago 14:32:22 CET 2022 

2.

Igual pero aplique a la fecha el formato siguiente:

Hoy es 18/08/2022 

d. Ejercicio 4: caracteres de protección

El directorio actual contiene los archivos f1, f2 y f3:

$ ls 
f1  f2  f3 

¿Qué obtendrá con los comandos siguientes?:

1.

$ echo * 

2.

$ echo \* 

3.

$ echo "*" 

4.

$ echo '*' 

5.

$ edad=20   
$ echo $edad 

6.

$ echo \$edad 

7.

$ echo "$edad" 

8.

$ echo '$edad' 

9.

$ echo "Tú eres $(logname) y tienes -> $edad años" 

10.

$ echo Tú eres $(logname) y tienes -> $edad años 

2. Variables, visualización y lectura del teclado

a. Ejercicio 1: variables

Escriba un script primer.sh y realice las operaciones siguientes:

  • Inicialice una variable nombre.

  • Inicialice una variable miFecha que contendrá la fecha actual.

  • Muestre las dos variables.

Ejecute este script.

b. Ejercicio 2: parámetros posicionales

Comandos filtro utilizados: wc (ver capítulo Los comandos filtro).

Escriba un shell script wcount.sh que produzca el resultado siguiente:

$ bash wcount.sh oso pájaro 
El nombre del script es: wcount.sh 
El primer argumento es: oso 
El segundo argumento es: pájaro 
Todos los argumentos: oso pájaro 
Número total de argumentos: 2 
El primer argumento contiene: 3 caracteres 
El segundo argumento contiene: 6 caracteres 

c. Ejercicio 3: lectura de teclado

Escriba un script hello.sh que:

1.

Solicite al usuario la introducción de su nombre y lo almacene en una variable. 

2.

Solicite al usuario la introducción de su apellido y lo almacene en otra variable.

3.

Muestre un mensaje de bienvenida al usuario.

4.

Muestre el PID del shell que ejecuta el script.

Ejemplo

$ hello.sh 
Introduzca...