Script de Shell - Variables y sustitución de comandos
Asigna con name=value y referencia con "$name", observa cómo las comillas simples y dobles se expanden de forma distinta, ejecuta la sustitución de comandos $(date), haz aritmética $(( n * 2 )) y lee entrada con read — ilustrado y practicado en una terminal del navegador.
En un script de shell, le das un nombre a un valor y lo reutilizas tantas veces como quieras.
Asignas con la forma name=value, y no debes poner espacios alrededor del =.
Si lo haces, se interpreta como un comando aparte y produce un error.
Lees el valor asignado con $name o ${name}.
Si un carácter sigue directamente a $name, se considera parte del nombre de la variable, así que usa ${name} para marcar el límite.
De la asignación a la referenciaMete un valor con name=alice y luego léelo con $name para usarlo.
Comillas — cómo difieren las simples y las dobles en la expansión
Hay dos tipos de comillas para envolver una cadena, y se expanden de forma distinta.
Dentro de las comillas simples '...', $name se trata literalmente y no se expande.
Dentro de las comillas dobles "...", $name se reemplaza por su valor.
Usa comillas dobles cuando quieras meter un valor en medio del texto, como "Hello $name", y comillas simples cuando quieras imprimir $ tal cual.
Expansión con comillas simples y doblesLas comillas simples imprimen $name tal cual; las dobles lo reemplazan por el valor.
name=alice# sin espacios alrededor de =echo"hello $name"# hello alice (las dobles expanden)echo'hello $name'# hello $name (las simples no)echo"path is ${name}/data"# usa {} para marcar el límite del nombre
Crea un script que ponga un nombre de usuario en una variable y muestre cómo cambia lo mostrado según las comillas.
① Abre quotes.sh con vi quotes.sh, pulsa i para entrar en el modo de inserción y escribe #!/bin/sh en la primera línea.
② En el script, asigna un nombre a una variable, luego imprime una línea con comillas dobles («saludo + variable») y una línea con comillas simples de la misma forma (puedes copiar lo que debes escribir desde el panel de respuesta y pegarlo).
③ Pulsa Esc, guarda y sal con :wq, luego dale permiso de ejecución al archivo.
④ Ejecuta el script y confirma que las líneas con comillas dobles y simples se muestran de forma distinta. (Si se ejecuta correctamente, aparece la explicación.)
Linux console
0 / 3 completado(s)
Loading Linux Terminal...
Escribe un comando y pulsa Enter para ejecutar
Sustitución de comandos — $()
$(command) es una forma de usar la salida de un comando como un valor justo donde lo escribes.
Escribe algo como today=$(date +%Y-%m-%d) y la fecha que produce date entra directamente en today.
Lo usas para capturar el resultado de un comando en una variable o para meterlo en medio del texto.
Cómo fluye la sustitución de comandos$(date) se reemplaza por la salida de ejecutar date, y today=$(date) pone ese valor en la variable.
today=$(date+%Y-%m-%d) # captura la salida de date en una variableecho"today is $today"# incrusta el valor capturado en el textouser=$(whoami) # la salida de otro comando también puede ser un valorecho"user: $user"
Crea un script que capture la salida de un comando en una variable con la sustitución de comandos $() y la incruste en un mensaje.
① Abre datestamp.sh con vi datestamp.sh, pulsa i para entrar en el modo de inserción y escribe #!/bin/sh en la primera línea.
② En el script, captura la salida de date en una variable con la sustitución de comandos $(), luego incrusta esa variable en una cadena con comillas dobles e imprímela en una línea (puedes copiar lo que debes escribir desde el panel de respuesta y pegarlo).
③ Pulsa Esc, guarda y sal con :wq, luego dale permiso de ejecución al archivo.
④ Ejecuta el script y confirma que se muestra un mensaje que contiene la fecha.
Linux console
0 / 3 completado(s)
Loading Linux Terminal...
Escribe un comando y pulsa Enter para ejecutar
Expansión aritmética — $(( ))
Dentro de $(( )) hay aritmética entera.
$(( 3 + 4 )) se reemplaza por 7.
Puedes usar + para sumar, - para restar, * para multiplicar, / para dividir y % para el resto.
Las variables van sin $, escritas simplemente por su nombre como $(( n * 2 )).
Cómo funciona la expansión aritméticaLa expresión dentro de $(( )) se evalúa: $(( 3 + 4 )) es 7, y con n=5 entonces $(( n * 2 )) es 10.
echo"sum: $(( 10 + 5 ))"# sumar da 15n=7echo"double: $(( n*2 ))"# las variables van sin un $echo"rest: $(( 17 % 5 ))"# el resto con % es 2
Crea un script que haga aritmética entera con la expansión aritmética $(( )).
① Abre calc.sh con vi calc.sh, pulsa i para entrar en el modo de inserción y escribe #!/bin/sh en la primera línea.
② En el script, asigna dos números a variables, usa $(( )) para hacer varios cálculos como la suma, el producto y el resto, e imprime los resultados en una línea (puedes copiar lo que debes escribir desde el panel de respuesta y pegarlo).
③ Pulsa Esc, guarda y sal con :wq, luego dale permiso de ejecución al archivo.
④ Ejecuta el script y confirma que se muestran los resultados calculados.
Linux console
0 / 3 completado(s)
Loading Linux Terminal...
Escribe un comando y pulsa Enter para ejecutar
Recibir entrada — read
read vlee una línea de entrada y la pone en la variable v.
Lo usas cuando quieres pedirle un valor al usuario dentro de un script.
En la consola de este curso, pasar la entrada por un pipe, como printf 'value\n' | ./greet.sh, funciona de forma fiable.
Imprimir una pregunta con echo antes de read deja más claro qué hay que teclear.
Recibir entrada con readread n lee una línea y la pone en n. Pasar un valor por pipe con printf lo entrega a read sin teclear a mano.
echo"enter your name:"# pregunta qué hay que teclearreadwho# lee una línea en whoecho"hi, $who"# incrusta en el texto el valor que recibisteprintf'bob\n' | (readwho; echo"hi, $who") # la entrada también puede venir de un pipe
Crea un script que lea una línea de entrada con read y la incruste en un saludo.
① Abre greet.sh con vi greet.sh, pulsa i para entrar en el modo de inserción y escribe #!/bin/sh en la primera línea.
② En el script, muestra una pregunta con echo, lee una línea para el nombre con read, luego incrusta ese nombre en un saludo con comillas dobles e imprímelo (puedes copiar lo que debes escribir desde el panel de respuesta y pegarlo).
③ Pulsa Esc, guarda y sal con :wq, luego dale permiso de ejecución al archivo.
④ Ejecuta el script pasando la entrada por un pipe y confirma que se muestra un saludo que contiene el nombre que introdujiste.
Linux console
0 / 3 completado(s)
Loading Linux Terminal...
Escribe un comando y pulsa Enter para ejecutar
Incrustar un conteo en un mensaje con sustitución de comandos
La sustitución de comandos $() se usa a menudo para capturar un «resultado contado», como un número de archivos, en una variable.
Escribe algo como n=$(ls *.txt | wc -l) y el resultado combinado de ls y wc -l entra en n.
Incrusta esa variable en una cadena con comillas dobles y puedes construir un mensaje legible de una línea que incluya el conteo.
Incrustar un conteo en un mensajeEl conteo de ls y wc -l entra en n por sustitución de comandos, e incrustarlo en el texto muestra txt files: 2.
Crea un script que tome el número de archivos de texto en una variable con sustitución de comandos y lo muestre incrustado en un mensaje.
① Como material para contar, crea un directorio de trabajo con mkdir -p vdemo y crea dos archivos .txt, como printf 'a\n' > vdemo/a.txt.
② Abre count-txt.sh con vi count-txt.sh, pulsa i para entrar en el modo de inserción y escribe #!/bin/sh en la primera línea.
③ En el script, toma el número de archivos .txt en vdemo en una variable con sustitución de comandos, luego incrusta esa variable en una cadena con comillas dobles y muestra un mensaje con el conteo (puedes copiar lo que debes escribir desde el panel de respuesta y pegarlo).
④ Pulsa Esc, guarda con :wq, dale permiso de ejecución, luego ejecútalo y confirma que se muestra un mensaje que contiene el conteo.
Linux console
0 / 3 completado(s)
Loading Linux Terminal...
Escribe un comando y pulsa Enter para ejecutar
QUIZ
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 1¿Cuál es la forma correcta de asignar a una variable de shell?
Pregunta 2¿Cómo se muestra echo '$name' (cuando name=alice)?
Pregunta 3¿Qué forma pone la salida de un comando en una variable como valor?