Comenzando con Bash

Hola Mundo

Concha Interactiva

El shell Bash se usa comúnmente interactivamente: Le permite ingresar y editar comandos, luego los ejecuta cuando presiona la tecla Return. Muchos sistemas operativos basados ​​en Unix y similares a Unix usan Bash como su shell predeterminado (especialmente Linux y macOS). El terminal ingresa automáticamente a un proceso de shell Bash interactivo al iniciarse.

Muestra Hello World escribiendo lo siguiente:

echo "Hello World"
#> Hello World  # Output Example

Notas

  • Puede cambiar el shell simplemente escribiendo el nombre del shell en la terminal. Por ejemplo: sh, bash, etc.

  • echo es un comando integrado de Bash que escribe los argumentos que recibe en la salida estándar. Agrega una nueva línea a la salida, de forma predeterminada.


Shell no interactivo

El shell Bash también se puede ejecutar de forma no interactiva desde un script, lo que hace que el shell no requiera interacción humana. El comportamiento interactivo y el comportamiento programado deben ser idénticos – una consideración de diseño importante de Unix V7 Bourne shell y transitivamente Bash. Por lo tanto, cualquier cosa que se pueda hacer en la línea de comando se puede poner en un archivo de script para su reutilización.

Siga estos pasos para crear un script Hello World:

  1. Crea un nuevo archivo llamado hello-world.sh

    touch hello-world.sh
    
  2. Haga que el script sea ejecutable ejecutando chmod +x hello-world.sh

  3. Agrega este código:

    #!/bin/bash
    echo "Hello World"
    

Línea 1: La primera línea del script debe comenzar con la secuencia de caracteres #!, denominada shebang1. El shebang le indica al sistema operativo que ejecute /bin/bash, el shell Bash, pasándole la ruta del script como argumento.

E.g. `/bin/bash hello-world.sh`

Línea 2: utiliza el comando echo para escribir Hello World en la salida estándar.

  1. Ejecute el script hello-world.sh desde la línea de comando utilizando uno de los siguientes:
  • ./hola-mundo.sh – más utilizados y recomendados
  • /bin/bash hola-mundo.sh
  • bash hola-mundo.sh – asumiendo que /bin está en tu $PATH
  • sh hola-mundo.sh

Para un uso de producción real, omitiría la extensión .sh (que de todos modos es engañosa, ya que se trata de un script Bash, no un script sh) y tal vez mueva el archivo a un directorio dentro de su PATH para que esté disponible independientemente de su directorio de trabajo actual, como un comando del sistema como cat o ls.

Los errores comunes incluyen:

  1. Olvidarse de aplicar el permiso de ejecución en el archivo, es decir, chmod +x hello-world.sh, lo que da como resultado ./hello-world.sh: Permiso denegado.

  2. Editar el script en Windows, que produce caracteres de final de línea incorrectos que Bash no puede manejar.

    A common symptom is : command not found where the carriage return has forced the cursor to the beginning of line, overwriting the text before the colon in the error message.

    The script can be fixed using the dos2unix program.

    An example use: dos2unix hello-world.sh

    dos2unix edits the file inline.

  3. Usar sh ./hello-world.sh, sin darse cuenta de que bash y sh son shells distintos con características distintas (aunque dado que Bash es compatible con versiones anteriores, el error opuesto es inofensivo).

    Anyway, simply relying on the script’s shebang line is vastly preferable to explicitly writing bash or sh (or python or perl or awk or ruby or…) before each script’s file name.

    A common shebang line to use in order to make your script more portable is to use #!/usr/bin/env bash instead of hard-coding a path to Bash. That way, /usr/bin/env has to exist, but beyond that point, bash just needs to be on your PATH. On many systems, /bin/bash doesn’t exist, and you should use /usr/local/bin/bash or some other absolute path; this change avoids having to figure out the details of that.


1 También conocido como sha-bang, hashbang, pound-bang, hash-pling.

Hola mundo usando variables

Crea un nuevo archivo llamado hello.sh con el siguiente contenido y dale permisos ejecutables con chmod +x hello.sh.

Ejecutar/Ejecutar a través de: ./hello.sh

#!/usr/bin/env bash

# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"

# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World

Esto imprimirá Hello, World en la salida estándar cuando se ejecute.

Para decirle a bash dónde está el script, debe ser muy específico, apuntándolo al directorio que lo contiene, normalmente con ./ si es su directorio de trabajo, donde . es un alias para el directorio actual. Si no especifica el directorio, bash intenta ubicar el script en uno de los directorios contenidos en la variable de entorno $PATH.


El siguiente código acepta un argumento $1, que es el primer argumento de la línea de comandos, y lo genera en una cadena formateada, después de Hola,.

Ejecutar/Ejecutar vía: ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World

Es importante tener en cuenta que $1 debe escribirse entre comillas dobles, no entre comillas simples. "$1" se expande al primer argumento de la línea de comando, como se desee, mientras que '$1' se evalúa como una cadena literal $1.

Nota de seguridad: Lea Implicaciones de seguridad de olvidar citar una variable en bash shells para comprender la importancia de colocar el texto de la variable entre comillas dobles.

Hola mundo con entrada de usuario

Lo siguiente le pedirá al usuario que ingrese y luego almacenará esa entrada como una cadena (texto) en una variable. Luego, la variable se usa para dar un mensaje al usuario.

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."

El comando leer aquí lee una línea de datos de la entrada estándar en la variable nombre. Luego se hace referencia a esto usando $name y se imprime a la salida estándar usando echo.

Salida de ejemplo:

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.

Aquí el usuario ingresaba el nombre “Matt”, y este código se usaba para decir Hola, Matt..

Y si desea agregar algo al valor de la variable mientras lo imprime, use corchetes alrededor del nombre de la variable como se muestra en el siguiente ejemplo:

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."

Salida de ejemplo:

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.

Aquí, cuando el usuario ingresa una acción, se agrega “ing” a esa acción mientras se imprime.

Importancia de citar en cadenas

Citar es importante para la expansión de cadenas en bash. Con estos, puede controlar cómo bash analiza y expande sus cadenas.

Hay dos tipos de citas:

  • Débil: usa comillas dobles: “
  • Fuerte: usa comillas simples: ‘

Si desea criticar para expandir su argumento, puede usar Citas débiles:

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World

Si no quiere criticar para expandir su argumento, puede usar Citas fuertes:

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world

También puede usar escape para evitar la expansión:

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world

Para obtener información más detallada además de los detalles para principiantes, puede continuar leyéndola [aquí] (https://www.wikiod.com/es/bash/citando).

Visualización de información para las funciones integradas de Bash

help <command>

Esto mostrará la página de ayuda (manual) de Bash para el integrado especificado.

Por ejemplo, help unset mostrará:

desarmar: desarmar [-f] [-v] [-n] [nombre…] Desestablecer valores y atributos de variables y funciones de shell.

Para cada NOMBRE, elimine la variable o función correspondiente.

Opciones: -f trata cada NOMBRE como una función de shell -v trata cada NOMBRE como una variable de shell -n trata cada NOMBRE como una referencia de nombre y desarma la variable en sí en lugar de la variable a la que hace referencia

Sin opciones, unset primero intenta desarmar una variable, y si eso falla, intenta desarmar una función.

Algunas variables no se pueden desarmar; véase también ‘solo lectura’.

Estado de salida: Devuelve éxito a menos que se proporcione una opción no válida o un NOMBRE sea de solo lectura.

Para ver una lista de todos los integrados con una breve descripción, use

help -d

Hola mundo en modo “Depurar”

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World

El argumento -x le permite recorrer cada línea del script. Un buen ejemplo está aquí:

$ cat hello.sh
#!/bin/bash 
echo "Hello World\n" 
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number) 

$ ./hello.sh 
Hello World

expr: non-integer argument

El error solicitado anteriormente no es suficiente para rastrear el script; sin embargo, el uso de la siguiente manera le da una mejor idea de dónde buscar el error en la secuencia de comandos.

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=

Manejo de argumentos con nombre

#!/bin/bash

deploy=false
uglify=false

while (( $# > 1 )); do case $1 in
   --deploy) deploy="$2";;
   --uglify) uglify="$2";;
   *) break;
 esac; shift 2
done

$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"

# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false