Intento

La versión estable se desprotegió el 14 de septiembre de 2022 . Hay cambios no verificados en plantillas o .
Bourne-Again Shell de GNU

Sesión típica en bash
Tipo de Cáscara de UNIX
Autor Brian zorro
Desarrollador Chet Ramey
Escrito en xi
Sistema operativo similar a UNIX
Idiomas de la interfaz Inglés , multilingüe ( gettext )
Primera edición 8 de junio de 1989
plataforma de hardware x86_64 [2] y i686 [2]
ultima versión
versión beta 5.2-beta ( 13 de abril de 2022 )
Formatos de archivo legibles Guión bash [d]
Licencia Licencia Pública General GNU
Sitio web gnu.org/software/bash/
 Archivos multimedia en Wikimedia Commons

Bash (del inglés  Bourne a gain shell , juego de palabras shell "Born again"  - shell "reborn") es una variación mejorada y modernizada del shell de comandos Bourne shell . Uno de los shells UNIX modernos más populares . Especialmente popular en el entorno Linux , donde a menudo se usa como un shell de comandos preinstalado.

Es un procesador de comandos que suele funcionar de forma interactiva en una ventana de texto. Bash también puede leer comandos de un archivo llamado script (o script ). Al igual que todos los shells de Unix, admite la finalización de archivos y directorios, sustitución de salida de comandos, variables, control sobre el orden de ejecución, sentencias de bifurcación y bucle. Las palabras clave, la sintaxis y otras características básicas del lenguaje se tomaron prestadas de sh . Otras funciones, como el historial, se han copiado de csh y ksh . Bash básicamente se ajusta al estándar POSIX , pero con varias extensiones [3] .

El nombre "bash" es un acrónimo del inglés.  Bourne-again-shell ("otro-Bourne-shell") y es un juego de palabras: Bourne-shell es una de las variedades populares del shell para UNIX (sh), creado por Stephen Bourne ( 1978 ), mejorado en 1987 por Brian Fox . El apellido Bourne (Born) hace eco de la palabra inglesa born , que significa "nacido", por lo tanto: shell de comando nacido de nuevo.

En septiembre de 2014, se descubrió en bash una vulnerabilidad Bashdoor ampliamente explotada .

Diferencias de sintaxis

La gran mayoría de los scripts importantes de shell de Bourne se pueden ejecutar sin modificaciones en bash, con la excepción de aquellos que se refieren a variables especiales de Bourne o usan funciones integradas de Bourne. La sintaxis del comando Bash incluye ideas prestadas del shell Korn ( ksh ) y el shell C ( csh ), como la edición de la línea de comandos, el historial de comandos, la pila de directorios, las variables $RANDOMy la $PPIDsintaxis de sustitución de comandos $(…). Cuando se usa como shell interactivo, Bash admite el autocompletado de nombres de programas, archivos, variables, etc. usando la tecla Tab ↹.

Comandos internos

El intérprete de bash tiene muchos comandos integrados, algunos de los cuales tienen archivos ejecutables similares en el sistema operativo . Tenga en cuenta, sin embargo, que la mayoría de las veces no hay páginas del manual para los comandos integrados , y cuando intenta ver la ayuda de un comando integrado, en realidad verá ayuda para el ejecutable. El archivo ejecutable y el comando incorporado pueden diferir en los parámetros. La información sobre los comandos incorporados se enumera en la página del manual de bash:

man bash

De entrada y salida
echo genera una expresión o el contenido de una variable ( stdout ), pero tiene limitaciones de uso [4]
printf comando de salida formateada, versión extendida del comandoecho
read "lee" el valor de una variable desde la entrada estándar ( stdin ), de forma interactiva es el teclado
sistema de archivos
cd cambia el directorio actual
pwd muestra el nombre del  directorio de trabajo actual
pushd invierte el directorio actual
popd devuelve el directorio actual despuéspushd
dirs enumera o borra el contenido de la pila de directorios guardados a través depushd
Acciones sobre variables
let realiza operaciones aritméticas con variables
eval traduce una lista de argumentos de una lista en comandos
set cambia los valores de las variables internas del script
unset elimina una variable
export exporta una variable, poniéndola a disposición de los procesos secundarios
declare,typeset establecer y/o imponer restricciones a las variables
getopts se utiliza para analizar los argumentos pasados ​​​​al script desde la línea de comando
Gestión de escenarios
source, .(punto) ejecutar el script especificado
exit terminación incondicional del guión
exec reemplaza el proceso actual con uno nuevo iniciado por el comandoexec
shopt le permite cambiar las claves (opciones) del shell "sobre la marcha"
equipos
true devuelve el código de salida cero (éxito)
false devuelve un código de salida que indica un error
type prog imprime la ruta completa a prog
hash prog recuerda el camino a prog
help COMMAND imprime una breve ayuda sobre el uso del comando interno COMMAND
Gestión de tareas que se ejecutan en el shell
jobs muestra una lista de tareas que se ejecutan en el shell de comandos o información sobre una tarea específica por su número
fg cambia el flujo de entrada a la tarea actual (o a una tarea específica, si se especifica su número) y continúa su ejecución
bg continúa la ejecución de la tarea actualmente suspendida (o tareas específicas, si se especifican sus números) en segundo plano
wait espera a que se completen las tareas especificadas

Guiones

En el caso más simple, un script  es una simple lista de comandos escritos en un archivo. El procesador de comandos debe saber que debe procesar este archivo y no solo leer su contenido. Esto se hace mediante una construcción especial llamada shebang : #!. El símbolo #especifica un comentario, pero en este caso shebang significa que después de este símbolo especial hay una ruta al intérprete para ejecutar el script.

Sintaxis

La sintaxis del comando bash es una sintaxis de comando de shell Bourne extendida. La especificación definitiva de la sintaxis del comando bash se encuentra en el Manual de referencia de Bash distribuido por el Proyecto GNU . [5]

"Hola mundo" #!/usr/bin/env bash echo '¡Hola mundo!'

Este script contiene solo dos líneas. La primera línea le dice al sistema qué programa se está utilizando para ejecutar el archivo. La segunda línea es la única acción que realiza este script, en realidad imprime "¡Hola mundo!" en la terminal

Ejecutando el script

Para hacer que un script sea ejecutable, se pueden usar los siguientes comandos:

chmod +rx scriptname # otorgar permisos de lectura/ejecución a cualquier usuario chmod u+rx scriptname # otorgar permisos de lectura/ejecución solo al "propietario" del script

Por motivos de seguridad, la ruta al directorio actual .no se incluye en la variable de entorno $PATH. Por lo tanto, para ejecutar el script, debe especificar explícitamente la ruta al directorio actual donde se encuentra el script:

./nombre del guión

Además, puede pasar explícitamente un archivo de este tipo al intérpretebash de Bash para su ejecución mediante el comando :

bash scriptname

En este caso, no se requiere ni la configuración de derechos de acceso ni el uso de una secuencia #!en el código.

Redirección de E/S

bash tiene descriptores de archivo incorporados : 0 (stdin), 1 (stdout), 2 (stderr).

  • stdin - entrada estándar - lo que el usuario escribe en la consola;
  • stdout - la salida estándar del programa;
  • stderr es la salida de error estándar.

Hay símbolos especiales para operaciones con estos identificadores definidos por el usuario: >(redireccionamiento de salida), <(redireccionamiento de entrada). Los caracteres &, -pueden preceder al número del descriptor; por ejemplo, 2>&1 redirigir el descriptor 2 (stderr) al descriptor 1 (stdout).

0<filenameo<filename Redirigir la entrada desde un archivofilename
1>filenameo>filename Redirigir la salida al archivo "nombre de archivo". Si la opción está deshabilitada noclobber, el archivo se sobrescribe con los datos entrantes
1>|filenameo>|filename Redirigir la salida al archivo "nombre de archivo", el archivo se sobrescribe con los datos entrantes
1>>filenameo >>filename Redirigir la salida al archivo "nombre de archivo", agregar datos al final del archivo. Si el archivo no existe, se crea
2>filename Redirigir la salida de error estándar a "nombre de archivo"
2>>filename Redirigir la salida de error estándar al archivo "nombre de archivo", agregar datos al final del archivo. Si el archivo no existe, se crea
&>filename Redirigir la salida y los errores a "nombre de archivo"
2>&1 Redirigir la salida de error a la salida estándar

Bash tiene una sintaxis de redirección personalizada que no es compatible con el shell de Bourne. Un ejemplo de redirección de salida estándar y errores estándar al mismo tiempo:

comando & > archivo

Esto es más fácil de escribir que el comando equivalente en la sintaxis de shell Bourne.

comando > archivo 2 > & 1

Redirigir "desde el código del script"

Sintaxis heredoc admitida :

  • Con la interpretación de variables y construcciones del lenguaje dentro del bloque:
$a = comando 'multilínea' <<MYDOC123 $a text $(<$HOME/my_file.txt) MYDOC123
  • Sin interpretar variables:
comando <<'CÓDIGOPERL' my $primero='Hola'; mi $segundo='mundo'; say join(', ',$primero,$segundo),'!'; CÓDIGOPERL
  • Con la sangría inicial eliminada (solo se admite la sangría de tabulación):
comando <<-'TABSTRIP' para ((i=0; i<10; i++)) hacer eco "$i" hecho TABSTRIP

Desde la versión 2.05b, bash puede redirigir la entrada estándar desde una cadena usando la siguiente sintaxis " here strings ":

comando <<< "cadena que se leerá como entrada estándar"

Si la cadena contiene espacios, debe estar entre comillas o apóstrofes, o los espacios deben estar separados por una barra invertida.

Tenga cuidado: la cadena ingresada usando cadenas aquí contiene una secuencia de terminación de línea implícita: 1 byte adicional de avance de línea o 2 bytes adicionales: retorno de carro y avance de línea.

gato - <<< '123' | wc -c # Resultado: 4 gato < ( echo -n '123' ) | wc -c # Resultado: 3 wc -c <<< '123' # Resultado: 4 echo -n 123 | wc -c # Resultado: 3

A partir de la versión 4.1 [6] , se hizo posible especificar una secuencia de terminación de caracteres en una línea e, inmediatamente después, un corchete. Esto puede ser útil para asignar una variable de contenido here-doc:

var = $( cat - <<'TERMSEQ' febrero. ¡Consigue un poco de tinta y llora! Escribe sollozando sobre febrero mientras el aguanieve retumbante se quema en negro en primavera. TERMSEQ )

Esto generará un mensaje de advertencia en BASH.

Redirección para el proceso como un todo

Ejemplo (redirigir la salida estándar a un archivo, escribir datos, cerrar el archivo, vaciar la salida estándar):

# hacer Filedescriptor(FD) 6 una copia de stdout (FD 1) exec 6 > & 1 # abrir el archivo "test.data" para escribir exec 1 >test.data # producir algo de contenido echo "data:data:data" # cerrar archivo "test.data" exec 1 > & - # hacer de stdout una copia de FD 6 (restablecer stdout) exec 1 > & 6 # cerrar FD6 exec 6 > & -

Abrir y cerrar archivos:

# abrir archivo test.data para leer exec 6 <test.data # leer hasta el final del archivo mientras se lee -u 6 dta do echo " $dta " done # cerrar archivo test.data exec 6 < & -

Sustitución de salida de comando

Captura de la salida de comandos externos:

# ejecutar 'fecha' y poner el resultado en VAR VAR = " $( fecha ) " echo " $VAR " #imprime la fecha en el momento en que se llamó a la línea anterior

Las cadenas de caracteres nulos no son compatibles, las líneas nuevas finales se pierden, a diferencia de las canalizaciones y otras E/S de archivos .

Operador condicional

#!/usr/bin/env bash T1 = 'foo' T2 = 'bar' if [[ $T1 == " $T2 " ]] luego echo 'condición cumplida' else echo 'condición fallida' fi

Tenga en cuenta que las comillas del lado izquierdo son opcionales. [7]

Ciclos

#!/usr/bin/env bash for i in "Number" { 1 ..10 } do echo " $i " done #!/usr/bin/env bash CONTADOR = 0 while [[ $COUNTER -lt 10 ]] # Siempre que la condición sea VERDADERA (devuelve 0) ejecuta el cuerpo del ciclo hacer echo El contador es $CONTADOR sea ​​CONTADOR = CONTADOR+1 hecho #!/usr/bin/env bash i = 0 hasta [[ $i -eq 10 ]] # Ejecutar el cuerpo del bucle hasta que la condición sea FALSA (devuelve un valor distinto de 0) do echo " $i " i = $(( $ i + 1 )) hecho #!/usr/bin/env bash # dentro de paréntesis dobles, las variables se pueden escribir en estilo C (sin $ ni operadores y operandos separados por espacios) for (( i = 0 ; i < 10 ; i++ )) do echo - n " $i ;" hecho

Matrices

Bash solo implementa matrices unidimensionales. Los índices pueden ser valores enteros ( matriz "regular" ) o cadenas ( " matriz asociativa " o "hash").

A pesar de la unificación de la sintaxis para trabajar con arrays ordinarios y asociativos, los primeros no son una variación de los segundos, ni desde el punto de vista del usuario final, ni desde el punto de vista de la lógica interna del propio intérprete.

Como consecuencia natural del soporte de bash para claves "asociativas", existe una capacidad muy limitada para emular arreglos multidimensionales.

Operaciones Generales

Obtenga una cadena que consta de todos los [8] elementos de una matriz separados por un espacio.

valores = " ${ arr [@] } "

Obtenga una cadena con todos los [8] índices o claves de una matriz, sin importar si son numéricos o de texto:

teclas = " ${ !arr[@] } "

Reemplace de forma masiva la primera aparición de la subcadena "MAY" con "MARCH" en todos los [8] elementos de la matriz y devuelva una cadena compuesta por los elementos resultantes de la matriz, separados por un espacio:

valores = " ${ arr [@]/MAY/MARZO } "

Lo mismo, pero en cada elemento [8] de la matriz, se reemplazarán todas las apariciones de la subcadena "MAY":

valores = " ${ arr [@]//MAYO/MARZO } "

Hasta ahora, no todas las posibilidades declaradas en la documentación funcionan correctamente para arreglos. Por ejemplo:

[ -v 'nombre_matriz' ]

no funciona correctamente para una matriz vacía. [9]

Operaciones en arreglos indexados

Bash tiene soporte para matrices unidimensionales. Los elementos de la matriz se pueden inicializar en la forma: my_array[xx]. También puede declarar explícitamente una matriz en un script usando la directiva declare:

declarar -a mi_matriz

Se puede acceder a los elementos individuales de una matriz usando llaves: "${my_array[xx]}".

Hay dos formas de inicializar una matriz indexada:

una)

Matriz =( elemento1 elemento2 elemento3 )

2)

matriz_temp [ 0 ]= elemento1 temp_array [ 5 ]= elemento matriz_temp [ 9 ]= elementoN

Agregar elementos al final de una matriz indexada:

declare -a arrAnimals arrAnimals =( perro elefante caballo vaca zorro koala tortuga ) # Mostrar el contenido de la matriz: echo " ${ arrAnimals [@] } " # Agregar un nuevo elemento al final de la matriz arrAnimals: "cerdo" arrAnimals +=( pig ) # Y muestra el contenido de la matriz nuevamente: echo " ${ arrAnimals [@] } "

Obtenga el primer elemento de una matriz:

echo " ${ arrAnimales [0] } "

Tanto las matrices indexadas como las asociativas admiten el llamado "rebanado":

# Otra forma de obtener el primer elemento de un arreglo echo " ${ arrAnimals [@]: 0 : 1 } " # Imprime 3 elementos de la matriz comenzando desde el 2: echo " ${ arrAnimals [@]: 2 : 3 } "

Nota: en el caso de arreglos asociativos, el orden de los valores en el caso general será aleatorio (determinado por la función hash utilizada), por lo que la operación de corte en un arreglo asociativo, aunque aceptable, tiene un alcance extremadamente limitado de aplicación práctica.

En matrices con índices numéricos, se permite el direccionamiento "inverso" ("negativo"), lo que le permite acceder a los elementos a partir del final de la matriz:

# Valor del último elemento del arreglo echo " ${ arrAnimals [-1] } " # Valor del penúltimo elemento del arreglo echo " ${ arrAnimals [-2] } " # ... y así sucesivamente.

Con el comando incorporado mapfile(sinónimo: readarray), puede mostrar el contenido de un archivo de texto en una matriz indexada:

declarar -un archivo con inicios de sesión mapfile fileWithLogins </etc/passwd for (( i = 0 ; i< ${# fileWithLogins [@] } ; i++ )) do echo "Line # $i : ${ fileWithLogins [ $i ] } " done Operaciones de matrices asociativas

A partir de la versión 4.0, bash introdujo soporte para arreglos asociativos (los llamados arreglos hash).

Los arreglos asociativos se declaran usando la tecla -Ade comando integrada declare:

declarar -A hshArray

Al igual que con los arreglos indexados, se pueden usar dos sintaxis diferentes para llenar los arreglos asociativos:

una)

TheCapitalOf [ Georgia ]= 'Tbilisi' TheCapitalOf [ Australia ]= 'Canberra' TheCapitalOf [ Pakistán ]= 'Islamabad'

2)

TheCapitalOf =([ Georgia ]= 'Tbilisi' [ Australia ]= 'Canberra' [ Pakistan ]= 'Islamabad' )

Las matrices asociativas pueden imitar la compatibilidad con matrices multidimensionales:

declare -A a # declara un arreglo asociativo 'a' i = 1 ; j = 2 # inicializa varios índices a [ $i , $j ]= 5 # asigna el valor "5" a la celda "$i,$j" (es decir, "1,2") echo ${ a [ $i , $j ] } # imprimir valores almacenados de "$i,$j"

Desafortunadamente, en las versiones actuales de bash, no es posible copiar el contenido de una matriz asociativa a otra mediante una simple asignación. Este problema solo se puede eludir, para lo cual existen dos enfoques fundamentalmente diferentes:

1) Emular la declaración del segundo hash desde cero copiando la declaración del primer hash:

declarar -A hsh1 hsh1 =( ... ) fuente < ( declarar -p hsh1 | sed 's/^declarar -A hsh1/declarar -A hsh2/' )

2) Recorra todos los [8] elementos del hash de origen y cópielos en el hash de destino:

declarar -A hsh1 hsh2 hsh1 =( ... ) for k in " ${ !hsh1[@] } " do hsh2 [ " $k " ]= " ${ hsh1 [ " $k " ] } " hecho Trabajo seguro con arreglos

Las matrices son una forma conveniente de pasar argumentos generados dinámicamente a funciones o comandos. En este caso, cada elemento de la matriz es un argumento independiente.

argumentos =( ls -l -a / ) ls " ${ argumentos [@] } " # ls -l -a / ls ${ argumentos [@] } # ls -l -a / ls ${ argumentos [*] } # ls -l -a /

Sin embargo, al usar arreglos de esta manera, se debe tener cuidado debido a las peculiaridades de expandir arreglos cuando se usan caracteres especiales @y como índices *.

Si la matriz está entre comillas y se expande usando el índice @, entonces se forma una cadena de palabras, donde cada palabra es un elemento separado de la matriz. Sin embargo, si no encierra la expansión de la matriz entre comillas dobles, puede obtener un resultado completamente diferente: los espacios que forman parte de los elementos de la matriz se convierten en separadores de palabras.

args =( -l -a '/home/user/Desktop' ) ls " ${ args [@] } " # ver el contenido del directorio '/home/user/Desktop' ls ${ args [@] } # error : los directorios '/home/user/Desktop' y './desk' no existen

Una matriz con índice *, entre comillas dobles, se expande en una sola línea, concatenando todos los elementos de la matriz a través de los delimitadores almacenados en la variable IFS. Si no especifica comillas dobles, la matriz se expande de la misma manera que cuando usa un índice @.

args =( '' usr local bin ) IFS = '/' ls " ${ args [*] } " # ver el contenido del directorio '/usr/local/bin' IFS = '/' ls ${ args [*] } # enumerar el contenido de los directorios '.', './usr', './local' y './bin' uno por uno

Al crear una matriz a partir del contenido de una variable de texto, debe tener en cuenta la posible presencia de espacios en el texto. Por ejemplo, como una de las formas de crear una matriz a partir de una cadena con una enumeración, puede considerar reemplazar el carácter delimitador con un espacio. Sin embargo, la presencia de espacios en elementos compartidos conducirá a la fragmentación de los propios elementos en partes.

matriz =( ${ texto //,/ } ) # incorrecto: el texto en la variable 'texto' podría contener caracteres de espacio en blanco IFS = ',' matriz =( $texto ) # correcto: el delimitador es una coma. IFS = ',' read -r -a array <<< " $texto " # correcto (alternativamente, redirigir el contenido de la variable 'texto' al comando 'leer')

La creación de una matriz a partir del texto recibido como salida de comandos o de un archivo puede generar errores, ya que no solo las líneas nuevas, sino también los espacios con tabulaciones se considerarán delimitadores por defecto [10] .

matriz =( " $( ls ) " ) # incorrecto: los espacios en los nombres de archivo pueden dividir un nombre de archivo en dos elementos de matriz IFS = $'\n' array =( " $( ls ) " ) # correcto: solo las traducciones de línea serán el delimitador mapfile -t array < < ( ls ) # correcto: alternativa a través del comando mapfile integrado

Transportador

La canalización pasa la salida del comando anterior a la entrada del siguiente, o a la entrada del shell. El método se usa a menudo para vincular una secuencia de comandos en una sola cadena. El transportador se indica con el símbolo de la tubería |.

Ejemplo ( grep funciona como un filtro en stdout):

nombre de archivo gato | patrón grep

Operaciones lógicas

El OR lógico se denota como ||. En operaciones condicionales, el operador ||devuelve 0 (éxito) si uno de los operandos es verdadero.

El AND lógico se denota como &&. En declaraciones condicionales, el operador &&devuelve 0 (éxito) si y solo si ambos operandos son verdaderos.

Nota: La posible confusión en la comprensión surge del hecho de que el comando true (y la finalización exitosa de cualquier comando) termina con un código de retorno de 0, éxito ( false, por el contrario, no 0), mientras que el valor booleano verdadero/falso es no -cero/ es igual a cero.

Ejemplos:

si es falso ; luego echo "con éxito" ; else echo "sin éxito" ; fi sin éxito sea ​​"a=(( 1 && 0 && 123))" ; eco $? ; echo $a 1 # Código de terminación de comando (resultado cero de evaluar una expresión aritmética) 0 # El valor de la variable "a", el resultado de una operación lógica if (( 1 && 0 && 123 )) ; luego echo "verdadero" ; más echo "falso" ; fi falso sea ​​"a=(( 1 && 123 && -345 ))" ; eco $? ; echo $a 0 # Código de salida del comando 1 # Valor de la variable "a", resultado de la operación lógica if (( 1 && 123 && -345 )) ; luego echo "verdadero" ; más echo "falso" ; es verdad falso && echo "Éxito" || eco "fallo" Finalización fallida

Matemáticas enteras

Bash puede realizar cálculos de enteros dentro de un proceso usando la sintaxis de comando ((…))y variable $((…))[11] , como se muestra a continuación:

VAR = 55 # Establezca VAR en 55 (( VAR = VAR + 1 )) # Agregue uno a VAR. Tenga en cuenta la ausencia del signo '$' (( VAR += 1 )) # Abreviatura de incremento (( ++VAR )) # Otra forma de aumentar VAR en uno. Realiza un incremento de prefijo (( VAR++ )) # Otra forma de incrementar el VAR en uno. Realiza un incremento de sufijo echo $(( VAR * 22 )) # Multiplica VAR por 22 y pasa el resultado al comando echo $ [ VAR * 22 ] # Manera heredada de hacer lo mismo (( VAR <<3)) # Desplazamiento a la izquierda bit a bit (igual que VAR*8) ((VAR>>3 )) # Desplazamiento de bit a la derecha (igual que VAR/8)

El comando ((…))también se puede usar en declaraciones condicionales, ya que su parámetro inicial es 0 o 1, lo que se puede interpretar como verdadero o falso:

if (( VAR == Y * 3 + X * 2 )) entonces echofi (( Z > 23 )) && echo

El comando ((…))admite los siguientes operadores de comparación: == != > < >= <=.

Bash no admite cálculos en proceso con números de coma flotante. Solo el shell Unix Korn (versión 1993 ) y zsh (desde la versión 4.0) admiten esta función.

Lista de operaciones matemáticas: +, -, *, /, **(exponenciación), %(módulo de división, resto de división), let - permite utilizar abreviaturas de comandos aritméticos (reduciendo el número de variables utilizadas; por ejemplo: a += bequivalente a = a + b, etc.).

Variables y argumentos

Argumentos:

$$ pid del shell actual (el proceso de script en sí)
$! pid del último proceso en segundo plano
$? código de retorno del último proceso (función o script)
$x donde x  es el número del parámetro pasado al script ( $1, $2etc. $0 es la última ejecución del script)
$# número de argumentos de línea de comando
$* todos los [8] argumentos como una sola cadena (palabra)
$@ lo mismo que $*, pero cada parámetro [8] se presenta como una línea separada (palabra)
$- lista de banderas pasadas al script
$_ contiene el último argumento del comando anterior

Variables integradas:

$BASH ruta al ejecutable bash
$BASHPID PID de bash actual * (ver nota)
$BASH_VERSINFO[n] matriz de 6 elementos que contienen información de la versión de bash
$BASH_VERSION versión de Bash instalada en el sistema
$DIRSTACK el contenido de la parte superior de la pila de directorios
$EDITOR editor predeterminado
$EUID número de identificación de usuario "efectivo" (ID de usuario efectivo)
$FUNCNAME nombre de la función actual
$GLOBIGNORE una lista de caracteres comodín que se ignorarán al realizar la sustitución del nombre de archivo (globbing)
$GROUPS grupos a los que pertenece el usuario actual
$HOME directorio de inicio del usuario
$HOSTNAME nombre de host de la red
$HOSTTYPE tipo de máquina (identifica la arquitectura de hardware)
$IFS separador de campo en la cadena de entrada
$LC_COLLATE establece el orden de clasificación de los caracteres, en las operaciones de sustitución de nombres de archivos y en las búsquedas con comodines
$LC_CTYPE define la codificación de caracteres
$LINENO Número de línea del script ejecutable
$MACHTYPE arquitectura de hardware
$OLDPWD antiguo directorio de trabajo
$OSTYPE tipo de sistema operativo
$PATH ruta de búsqueda (incluye directorios /usr/bin/, /usr/X11R6/bin/, /usr/local/binetc.)
$PIPESTATUS Código de retorno de canal (tubería)
$PPID PID (identificador) del proceso padre
$PS1 solicitud de línea de comando
$PS2 solicitud de línea de comando secundaria, que se muestra cuando se espera una entrada adicional del usuario. Normalmente se muestra como ">"
$PS3 mensaje terciario, que se muestra cuando el usuario tiene que hacer una elección en una declaraciónselect
$PS4 indicador de nivel 4, impreso (modificado) al comienzo de cada línea de salida de depuración cuando se invoca el script con el -x. Normalmente se muestra como "+", "++", etc.
$PWD directorio de trabajo (actual)
$REPLY la variable predeterminada donde se escribe la entrada del usuario del comandoread
$SECONDS tiempo de ejecución del script (en segundos)
$SHELLOPTS lista de opciones de intérprete válidas (solo lectura)
$SHLVL nivel de anidamiento de la concha
  • Nota: diferente de $$ en ciertas circunstancias, como subcapas que no requieren que bash se reinicie.

Ejemplo:

$ echo $(eco $BASHPID $$) $$ $BASHPID 25680 16920 16920 16920 # | | | | # | | | -- $BASHPID fuera de la subcapa # | | -- $$ fuera de la subcapa # | -- $$ dentro de la subcapa # -- $BASHPID dentro de la subcapa


Expresiones regulares dentro de un proceso

Bash 3.0 admite expresiones regulares integradas con una sintaxis similar a la de Perl :

[[ cadena = ~ expresión regular ]]

La sintaxis de las expresiones regulares está documentada en las páginas de documentación de man 7 regex. El estado de salida se establece en 0 si la expresión regular coincide con la cadena y en 1 en caso contrario. El valor de una subexpresión encerrada entre paréntesis se puede obtener [8] a través de una variable ${BASH_REMATCH[@]}, por ejemplo:

REGEXP = 'foo(bar)bl(.*)' if [[ "abcfoobarbletch" = ~ $REGEXP ]] luego echo "Regex cadena coincidente!" echo " $BASH_REMATCH " # imprime: foobarbletch echo " ${ BASH_REMATCH [1] } " # imprime: bar echo " ${ BASH_REMATCH [2] } " # imprime: etch fi

Las expresiones regulares incorporadas suelen ser más rápidas que ejecutar un comando grep externo porque la expresión regular correspondiente se ejecuta dentro del proceso bash. Si la expresión regular o cadena contiene espacios o metacaracteres (como *o ?), deben estar entre comillas. Se recomienda utilizar una variable para contener la expresión regular, como en el ejemplo anterior, para evitar problemas con los caracteres especiales de escape. Puede usar la salida bash con una opción -xpara verificar cómo bash analiza su expresión regular.

Expansión de corchetes

La función de expansión de llaves se toma prestada de csh . Permite que se forme una cadena arbitraria utilizando una técnica similar, como se hace con los nombres de archivo. Sin embargo, en bash, las cadenas generadas no tienen que ser nombres de archivos. El resultado de cada expansión de cadena no se ordena, el orden se conserva de izquierda a derecha:

# Esta es una característica de bash echo a { p,c,d,b } e # ape ace ade abe

No debe usar esta característica si el script se va a portar, porque en los scripts tradicionales la expansión de cadenas no funcionará:

# El shell tradicional no da el mismo resultado echo a { p,c,d,b } e # a{p,c,d,b}e

Cuando la expansión de corchetes se usa en combinación con comodines, los corchetes se expanden primero y luego el resultado se procesa normalmente. Por lo tanto, se puede obtener una lista de imágenes JPEG y PNG en el directorio actual de la siguiente manera:

ls*. { jpg,jpeg,png } # los corchetes se expanden a *.jpg *.jpeg *.png, después de lo cual se realiza una búsqueda con comodines

Teclas de acceso rápido

  • Tab ↹: Autocompletar la línea detrás del cursor.
  • Ctrl++ ! Ctrl: !Repite el último comando.
  • Ctrl+ a: Mueve el cursor al principio de la línea (equivalente a la tecla Home).
  • Ctrl+ b: Mueve el cursor hacia atrás un carácter (equivalente a la tecla ←).
  • Ctrl+ r: Búsqueda por comandos tecleados previamente.
  • Ctrl+ : Envía una cseñal SIGINT al trabajo actual, que generalmente (pero no siempre) termina y lo cierra.
  • Ctrl+ d: envía un marcador EOF que (a menos que esté deshabilitado por una opción y la línea actual no contenga texto) cierra el shell actual (equivalente al comando de salida ), cuando se ingresa al programa en ejecución, finaliza la entrada si no hay texto en la línea , de lo contrario finaliza la línea sin un terminador de línea.
  • Ctrl+ d: Elimina el carácter actual (solo si hay texto en la línea actual) (equivalente a la tecla Delete).
  • Ctrl+ e: Mueve el cursor al final de la línea (equivalente a la tecla End).
  • Ctrl+ f: Mueve el cursor un carácter hacia adelante (equivalente a la tecla →).
  • Ctrl+ h: Elimina el carácter anterior (igual que la tecla ← Backspace).
  • Ctrl+ i: Equivalente a la tecla Tab ↹.
  • Ctrl+ j: Equivalente a la tecla ↵ Enter.
  • Ctrl+ k: Borra el contenido de la línea después del cursor y lo copia en el portapapeles de la instancia de bash (anillo de eliminación).
  • Ctrl+ l: Borra el contenido de la pantalla (equivalente al comando clear).
  • Ctrl+ m: Equivalente a la tecla ↵ Enter.
  • Ctrl+ n: (siguiente) se desplaza al siguiente comando (equivalente a la tecla ↓).
  • Ctrl+ o: Ejecuta el comando encontrado en el historial y selecciona la siguiente línea relativa a la línea actual en el historial para su edición.
  • Ctrl+ p: (anterior) se desplaza al comando anterior (equivalente a la tecla ↑).
  • Ctrl+ q: reanudar la salida del proceso.
  • Ctrl+ s: Suspender salida de proceso (stop).
  • Ctrl+ t: Intercambiar caracteres adyacentes.
  • Ctrl+ u: Borra el contenido de la línea hasta el cursor y lo copia en el portapapeles de la instancia de bash (anillo de eliminación).
  • Ctrl+ w: Elimina la palabra hasta el cursor y la copia en el portapapeles de la instancia bash (kill ring).
  • Ctrl+ y: Agrega el contenido del portapapeles de la instancia de bash desde la posición del cursor.
  • Ctrl+ z: Envía una señal SIGTSTP al trabajo actual, que suspende su ejecución y reanuda la recepción de comandos. Para reanudar su ejecución en segundo plano, puede emitir el comando bg. Para traerlo de fondo o suspenderlo, puede ejecutar fg.
  • Ctrl+ /: Finaliza el proceso actual con un volcado del núcleo señalándolo.
  • Ctrl+ _( Ctrl+ ⇧ Shift+ -): Deshacer la edición.
  • Alt+ >: Salta al último comando del historial.
  • Alt+ b: (hacia atrás) mueve el cursor hacia atrás una palabra (equivalente a la tecla Ctrl+ ←).
  • Alt+ d: acorta la palabra después del cursor.
  • Alt+ f: (adelante) mueve el cursor una palabra hacia adelante (equivalente a la tecla Ctrl+ →).
  • Alt+ t: Intercambia las dos palabras antes del cursor.
  • Alt+ .: Agrega el último argumento al comando anterior.
  • Alt+ c: Cambia la letra debajo del cursor a mayúscula.
  • Alt+ l: Cambia la letra debajo del cursor a minúsculas.
  • Ctrl++ x Ctrl: xMueve el cursor al principio de la línea desde la posición actual y hacia atrás.
  • Ctrl++ x Ctrl: eEdita la línea actual en el programa $EDITOR, o vi si no está predefinido.
  • Ctrl++ x Ctrl: vmuestra la información de la versión de la instancia de bash actual.

Iniciar secuencias de comandos

Bash invoca comandos de muchos scripts diferentes al inicio.

Cuando bash se invoca como un shell de inicio de sesión interactivo , lo primero que hace es leer y ejecutar comandos desde un archivo , si ese archivo existe. Después de leer este archivo, examina los siguientes archivos en el siguiente orden: , y , lee e invoca comandos desde el primero que existe y es legible. Al salir, bash lee y ejecuta comandos del archivo . /etc/profile~/.bash_profile~/.bash_login~/.profile~/.bash_logout

Cuando se inicia un shell interactivo, pero no para iniciar sesión, bash lee y ejecuta comandos de archivos /etc/bash.bashrcy ~/.bashrcsi existen. Esto se puede anular con la opción -norc. La opción -rcfile fileobligará a bash a usar los comandos del archivo fileen lugar de /etc/bash.bashrcy ~/.bashrc.

Portabilidad

La primera línea del script debe ser una entrada #!/bin/bashsi se conoce la ruta absoluta al ejecutable, o #!/usr/bin/env bashpara determinar automáticamente la ruta al ejecutable a través del comando env usando la variable de entorno PATH [12] .

Los scripts de shell escritos con funciones específicas de bash no funcionarán en sistemas que utilicen el shell Bourne (sh) o uno de sus equivalentes , a menos que se haya instalado bash como un shell adicional. Este problema se volvió especialmente importante cuando Ubuntu comenzó a enviar el shell Debian Almquist (guión) como el shell de secuencias de comandos predeterminado en octubre de 2006, lo que provocó que se rompieran numerosos scripts.

Interfaz gráfica para scripts

Hay muchos programas que le permiten crear una interfaz gráfica para bash scripts.

  • dialog  es una utilidad que le permite crear cuadros de diálogo en la consola, utilizando las bibliotecas curses y ncurses .
  • whiptail  es un análogo de la utilidad de diálogo, utiliza la biblioteca newt .
  • zenity  es la aplicación GUI más popular para secuencias de comandos.
  • kdialog  es un análogo de zenity en el entorno KDE .
  • yad  es una bifurcación de zenity, con más características.
  • xdialog  es un reemplazo para el diálogo, diseñado para brindar a los programas iniciados en el terminal la interfaz del sistema X Window .
  • gtkdialog  es la utilidad más funcional para crear aplicaciones gráficas en scripts bash.

Véase también

Notas

  1. Ramey C. Bash-5.2 Lanzamiento disponible  (inglés) - 2022.
  2. 1 2 GNU Guix - 2012.
  3. William McCarty. Aprendiendo Debian GNU/Linux .  13. Conquistando el BASH Shell . O'Reilly Media (6 de octubre de 1999) . Consultado el 6 de diciembre de 2018. Archivado desde el original el 9 de noviembre de 2017.
  4. No se puede mostrar el valor de una variable que contiene -n(a diferencia de printf -- '%s\n' "${переменная}") porque se -ninterpreta como un parámetro de comando echo.
  5. Manual de referencia de Bash Archivado el 13 de mayo de 2019 en Wayback Machine .
  6. Noticias de Bash . Fecha de acceso: 18 de enero de 2017. Archivado desde el original el 1 de febrero de 2017.
  7. BashGuide/TestsAndConditionals Archivado el 12 de febrero de 2014 en Wayback Machine  - Greg's Wiki.
  8. 1 2 3 4 5 6 7 8 Se deben usar comillas para obtener todos los elementos, incluidos los elementos de espacios y cadenas vacías.
  9. Aquí los apóstrofes se usan correctamente.
  10. ↑ bash(1) : GNU Bourne-Again SHell - Página del manual de Linux  . linux.die.net. Consultado el 11 de julio de 2017. Archivado desde el original el 27 de diciembre de 2019.
  11. Versión obsoleta: $[…].
  12. env(1) - Página del manual de Linux . man7.org. Consultado el 21 de enero de 2017. Archivado desde el original el 13 de enero de 2017.

Enlaces