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
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
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
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:
|
2. |
Igual pero aplique a la fecha el formato siguiente:
|
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. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
7. |
|
8. |
|
9. |
|
10. |
|
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...