BashEmpezando con Bash


Versiones

Versión Fecha de lanzamiento
0.99 1989-06-08
1.01 1989-06-23
2.0 1996-12-31
2.02 1998-04-20
2.03 1999-02-19
2.04 2001-03-21
2.05b 2002-07-17
3.0 2004-08-03
3.1 2005-12-08
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014-02-26
4.4 2016-09-15

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
 

Hola Mundo

Shell interactivo

El shell Bash se usa comúnmente de forma interactiva: le permite ingresar y editar comandos y luego ejecutarlos cuando presiona la tecla Retorno . Muchos sistemas operativos basados ​​en Unix y similares a Unix usan Bash como su shell predeterminado (en particular, Linux y macOS). El terminal ingresa automáticamente un proceso de shell Bash interactivo en el inicio.

Salida 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 incorporado de Bash que escribe los argumentos que recibe en la salida estándar. Añade una nueva línea a la salida, por defecto.


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 guión deben ser idénticos: una consideración de diseño importante para el shell Bourne de Unix V7 y el tránsito de Bash. Por lo tanto, cualquier cosa que se pueda hacer en la línea de comandos se puede poner en un archivo de script para su reutilización.

Siga estos pasos para crear un script de Hello World :

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

    touch hello-world.sh
     
  2. Haz el script ejecutable ejecutando chmod +x hello-world.sh

  3. Añade este código:

    #!/bin/bash
    echo "Hello World"
     

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

    Por ejemplo, /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 usando uno de los siguientes:

    • ./hello-world.sh - más comúnmente usado y recomendado
    • /bin/bash hello-world.sh
    • bash hello-world.sh - asumiendo que /bin está en tu $PATH
    • sh hello-world.sh

Para un uso de producción real, .sh extensión .sh (que de todas formas es engañosa, ya que se trata de un script Bash, no de un script sh ) y tal vez mueva el archivo a un directorio dentro de su PATH para que esté disponible sin importar su directorio de trabajo actual, al igual que 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 , dando como resultado la salida de ./hello-world.sh: Permission denied .

  2. Edición del script en Windows, que produce caracteres de final de línea incorrectos que Bash no puede manejar.

    Un síntoma común es : command not found donde el retorno de carro ha forzado el cursor al principio de la línea, sobrescribiendo el texto antes de los dos puntos en el mensaje de error.

    El script se puede arreglar usando el programa dos2unix .

    Un ejemplo de uso: dos2unix hello-world.sh

    dos2unix edita el archivo en línea.

  3. Usando sh ./hello-world.sh , no me sh ./hello-world.sh cuenta de que bash y sh son carcasas distintas con características distintas (aunque Bash es compatible con versiones anteriores, el error opuesto es inofensivo).

    De todos modos, simplemente confiar en la línea shebang del script es sumamente preferible a escribir explícitamente bash o sh (o python o perl o awk o ruby o ...) antes del nombre de archivo de cada script.

    Una línea shebang común para usar con el fin de hacer que tu script sea más portátil es usar #!/usr/bin/env bash lugar de codificar de forma rígida una ruta a Bash. De esa manera, /usr/bin/env tiene que existir, pero más allá de ese punto, bash solo necesita estar en su PATH . En muchos sistemas, /bin/bash no existe, y debe usar /usr/local/bin/bash o alguna otra ruta absoluta; este cambio evita tener que averiguar los detalles de eso.


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

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 permite caminar a través de cada línea en el script. Un buen ejemplo es 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 anterior 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 el script.

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

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

Hola mundo usando variables

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

Ejecutar / Ejecutar vía: ./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 a 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 contiene, normalmente con ./ si es su directorio de trabajo, dónde . Es un alias del directorio actual. Si no especifica el directorio, bash intenta localizar el script en uno de los directorios contenidos en la $PATH entorno $PATH .


El siguiente código acepta un argumento $1 , que es el primer argumento de la línea de comando, y lo envía en una cadena con formato, siguiendo a Hello,

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 cotizarse entre comillas dobles, no comillas simples. "$1" expande al primer argumento de la línea de comando, según lo deseado, mientras que '$1' evalúa como una cadena literal $1 .

Nota de seguridad:
Lea las implicaciones de seguridad de olvidarse de citar una variable en las bases para entender la importancia de colocar el texto de la variable entre comillas dobles.

Hola mundo con entrada de usuario

Lo siguiente le pedirá a un usuario que ingrese información, y luego la almacenará como una cadena (texto) en una variable. La variable se utiliza para dar un mensaje al usuario.

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

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

Ejemplo de salida:

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

Aquí el usuario ingresó el nombre "Matt", y este código se usó para decir Hello, 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."
 

Ejemplo de salida:

$ ./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 cuerdas

Las citas son importantes para la expansión de cadenas en bash. Con estos, puedes controlar cómo el bash analiza y expande tus cadenas.

Hay dos tipos de citas:

  • Débil : utiliza comillas dobles: "
  • Fuerte : usa comillas simples: '

Si quiere golpear para expandir su argumento, puede usar Weak Quoting :

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

Si no quiere golpear para expandir su argumento, puede usar Strong Quoting :

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

También puedes 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 leyendo aquí .

Visualización de información para Bash incorporados

help <command>
 

Esto mostrará la página de ayuda (manual) de Bash para la función incorporada especificada.

Por ejemplo, help unset mostrará:

unset: unset [-f] [-v] [-n] [name ...]
   Unset values and attributes of shell variables and functions.

   For each NAME, remove the corresponding variable or function.

   Options:
     -f    treat each NAME as a shell function
     -v    treat each NAME as a shell variable
     -n    treat each NAME as a name reference and unset the variable itself
       rather than the variable it references

   Without options, unset first tries to unset a variable, and if that fails,
   tries to unset a function.

   Some variables cannot be unset; also see `readonly'.

   Exit Status:
   Returns success unless an invalid option is given or a NAME is read-only.
 

Para ver una lista de todas las incorporaciones con una breve descripción, use

help -d