Variables de Bash especiales con ejemplos

Variables de Bash especiales con ejemplos

Bash es un excelente lenguaje de codificación, que le permite hacer cosas complejas como la manipulación de big data, o simplemente crear scripts de gestión severos o de escritorio.

La habilidad de nivel de entrada requerida para usar el lenguaje BASH es bastante baja, y los scripts de una línea (una jerga a menudo usada, que indica múltiples comandos ejecutados en la línea de comando, formando un mini-script), así como scripts regulares, pueden crecer en complejidad (y qué tan bien escritos están) a medida que el desarrollador de bash aprende más.

Aprender a usar variables especiales en Bash es una parte de esta curva de aprendizaje. Mientras que originalmente las variables especiales pueden parecer crípticas: $$, $?, $*, \ $ 0, $ 1, etc., Una vez que los comprenda y los use en sus propios guiones, las cosas pronto se volverán más claras y más fáciles de recordar.

En este tutorial aprenderás:

  • Cómo usar variables especiales en Bash
  • Cómo citar correctamente las variables, incluso las especiales
  • Ejemplos que usan variables especiales desde la línea de comandos y scripts

Variables de Bash especiales con ejemplos

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Otro Cualquier utilidad que no esté incluida en el shell bash de forma predeterminada se puede instalar utilizando sudo apt-get instalación de utilidad de utilidad (o yum instalación para sistemas basados ​​en redhat)
Convenciones # - requiere que los comandos de Linux se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux se ejecuten como un usuario regular no privilegiado
  1. $$ - Muestre el PID (identificador de proceso)

    En este ejemplo, usamos la variable especial $$ Para mostrar el PID (identificador de proceso) Para nuestro programa actual. Esto funciona de manera un poco diferente dependiendo de si usa esta variable desde la línea de comando:

    $ Echo $$ 316204 $ PS -EF | GREP -E "$$ | PID" UID PID PPID C TIME TTY TTY CMD ROEL 316204 62582 0 11:53 pts/2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS/2 00:00:00 PS - EF Roel 316500 316204 0 11:57 pts/2 00:00:00 Grep -e 316204 | PID 

    O desde dentro de un script. Por ejemplo, consideremos el siguiente script prueba.mierda:

    echo $$ ps -ef | grep -e "$$ | pid" 
    Copiar

    Que, cuando lo hacemos ejecutable (prueba de chmod +x.mierda) y ejecutar, produce:

    Prueba de $ chmod +x.sh $ ./prueba.SH 316820 UID PID PPID C TIME TTY TTY CMD ROEL 316820 316204 0 12:01 PTS/2 00:00:00 BASH ROEL 316821 316820 0 12:01 PTS/2 00:00:00 PS -EF ROEL 316822 316820 0 12: 01 pts/2 00:00:00 Grep -e 316820 | Pid 

    La diferencia está en el Pid producido! A primera vista puede tener sentido conceptual, pero expliquemos la razón principal por la cual el Pid difiere: estamos usando un shell bash diferente. El primer comando ejecutado fue directamente en la línea de comando, y por lo tanto nuestro especial $$ variable (que identifica el PID del programa en ejecución actualmente) produce el Pid del shell bash actualmente en funcionamiento (siendo 316204).

    En la segunda instancia, estamos ejecutando un script y cada inicio de un script siempre iniciará un nuevo shell bash. El resultado es que nuestro Pid es el Pid del recién iniciado Bash Shell (316820). También podemos confirmar esto mirando el Ppid (i.mi. PID de padres, o el padre del identificador del proceso) - es 316204 que coincide con nuestro shell bash a partir del que comenzamos el script, como se ve en el primer ejemplo (tanto el primer y el segundo ejemplo se ejecutaron en el mismo terminal en la misma máquina).

    El Grep -E El comando en nuestros dos ejemplos nos permite capturar la primera línea de la lista de procesos completos de la máquina (según lo obtenido por PS -EF) permitiendo soporte extendido de regex y espeluznante para Pid además de nuestro Pid (mediante el uso $$). El | es el separador de expresión regular extendido que permite esta captura dual.

    Para obtener más información sobre expresiones regulares, consulte nuestras reglas bash para principiantes con ejemplos y avanzado bash regex con artículos de ejemplos.

    También tenga en cuenta que hemos automatizado la captura PID utilizando $$ en el grep dominio. Este $$ La variable nunca cambia a menos que se inicie un nuevo shell / subshell de Bash, como podemos ver en el siguiente ejemplo:

    $ Echo $$ 316204 $ BASH $ ECHO $$ 318023 $ ECHO $ ​​PPID 316204 

    El Pid de nuestro caparazón principal 316204 como antes. A continuación, comenzamos una nueva subshell y el Pid de este nuevo caparazón es 318023 Cuando se inspecciona. Y, utilizando la variable automáticamente establecida (por Bash) $ PPID Podemos confirmar el Ppid (ID de proceso principal) del shell/subshell de Bash secundaria como 316204, que coincide con nuestro caparazón principal. Como puede ver, en términos de gestión de procesos y específicamente el $$ variable, no hay mucha diferencia entre comenzar un script y una nueva subshell.

    Para obtener más información sobre la gestión de procesos bash, es posible que desee consultar nuestra gestión de procesos de antecedentes de BASH y la gestión de la lista de procesos y los artículos de terminación automática de procesos.



  2. ps? - código de salida

    El ps? variable nos dice qué código de salida era del comando anterior. Conociendo el código de salida de una declaración ejecutada nos permite continuar un script en dos o más direcciones diferentes. Por ejemplo, si comenzamos un RM Comando (para eliminar algunos archivos) desde un programa, es posible que deseemos verificar si el proceso se completó correctamente.

    Si el código de salida es 0, Generalmente (léase: casi siempre) significa que un proceso termina con éxito. Si sin embargo el código de salida es 1 (o más) a menudo (aunque no siempre) significa que el proceso terminó con un error o resultado negativo, por ejemplo, el archivo no se pudo eliminar en nuestro ejemplo. Veamos cómo funciona esto en la línea de comandos, recordando que el funcionamiento de esta variable desde dentro de un script es idéntico.

    $ toque esto.existe $ rm esto.existe $ echo $? 0 $ rm esto.hace.no.existir rm: no puede eliminar 'esto.hace.no.existir ': no ​​hay dicho archivo o directorio $ echo $? 1 

    Primero creamos un archivo este.existe mediante el uso del tocar dominio. tocar simplemente crea un archivo de tamaño cero sin escribirle nada. A continuación, eliminamos el archivo usando RM esto.existe y mostrar el ps? Código de salida usando eco. El resultado es 0 a medida que el comando tuvo éxito como se anticipó y se ve por ningún error que se devuelve.

    A continuación, intentamos eliminar un archivo que no existe y recibir un error. Cuando verificamos el código de salida, es de hecho 1 indicando que ocurrió algún error. Podemos verificar el valor de esta variable fácilmente desde la línea de comando o desde dentro de un script utilizando un Si [$? -eq 0]; entonces o una declaración condicional similar (terminada por FI).

    Para aprender más sobre si Declaraciones basadas, consulte las declaraciones BASH IF si elife más, entonces FI. Combinatorio ps? con si Las declaraciones es común y poderosa para automatizar varias cosas en Bash.

  3. $ 1, $ 2, ... $* - Argumentos de aprobación

    Cuando iniciamos un script en la línea de comandos de Bash, podemos pasar argumentos a la misma. Depende completamente del script manejar los argumentos que se le pasan. Si el script, por ejemplo, no maneja los argumentos (el valor predeterminado), entonces no hay consecuencias para especificar o no especificar ninguna, o muchas, variables a un script.

    Podemos manejar argumentos aprobados utilizando las variables especiales $ 1, $ 2, ps etc. El primer argumento transmitido al guión siempre será $ 1, El segundo argumento siempre será $ 2 etc. Una cosa a tener en cuenta es que si introduce un espacio en un cliente bash configurado predeterminado, entonces Bash interpretará ese espacio como un separador.

    Si está tratando de pasar un texto como por ejemplo esto es un ejemplo necesitaría citarlo correctamente así: "esto es un ejemplo"; Para que Bash vea ese texto como una sola variable que se está aprobando.



    El especial ps La variable es una taquigrafía para escribir Todas las variables en una sola cadena. Veamos cómo funciona esto definiendo un nuevo test2.mierda Script de la siguiente manera:

    echo "1: $ 1" echo "2: $ 2" echo "all: $ *" 
    Copiar

    Como una ligera variación, elegimos definir nuestras variables aquí como $ 1 a ps en lugar de $ 1 a ps. De hecho, sería una buena idea citar siempre las variables de esta manera. Para obtener más información, eche un vistazo a nuestro análisis y citas de variables correctas en el artículo de Bash.

    Cuando ejecutamos lo mismo, usando dos o tres argumentos, vemos:

    $ chmod +x test2.sh $ ./Test2.sh '1 "2' 1: 1 2: 2 Todos: 1 2 $ ./Test2.sh '1 "2" 3' 1: 1 2: 2 Todos: 1 2 3 

    Podemos ver cómo nuestra primera entrada al script se reconoce correctamente como $ 1 etc. Además, notamos que el tercer argumento es completamente ignorado por el script hasta llegar al echo "all: $ *" Instrucción que de hecho muestra todos los argumentos como se discutió anteriormente. Exploremos ahora una entrada incorrecta sin citar:

    ps ./Test2.sh esto está destinado a ser una sola oración. 1: esto 2: es todo: esto está destinado a ser una sola oración. ps ./Test2.sh "Esto está destinado a ser una sola oración."1: Esto está destinado a ser una sola oración. 2: Todos: esto está destinado a ser una sola oración. 

    Aquí queda claro cómo se puede interpretar un espacio como un separador en lugar de un espacio real, a menos que el texto se cita correctamente. En el primer resultado, Este se ve como el primer argumento, mientras que en el segundo resultado, toda la oración se ve como el primer argumento.



  4. $ 0 - el comando que se ejecuta

    Habiendo aprendido sobre $ 1, Uno podría preguntarse qué \ $ 0 Variable especial lo hace. Si piensa en cómo se forma un comando (argumento de comando1 argumento2 etc.), puede notar cómo dominio viene antes del primer argumento ($ 1). El comando, en cierto modo, es así: visualmente - \ $ 0, y esto es exactamente lo que el especial \ $ 0 variable contiene; el comando ejecutando.

    $ echo \ $ 0 Bash 

    Como podemos ver, y como tiene sentido, en la línea de comando, el comando actualmente en ejecución es intento. Si agregamos el echo \ $ 0 comandar a un script de prueba test3.mierda y ejecutar lo mismo, obtenemos:

    ps ./Test3.mierda ./Test3.SH $ ... /espacio de trabajo /test3.sh ... /espacio de trabajo /test3.mierda 

    Como ahora, el comando en ejecución actualmente es ./Test3.mierda, exactamente como se ejecuta desde la línea de comando. Si iniciamos el comando usando un nombre de ruta más largo como … /Espacio de trabajo /test3.mierda Entonces, de nuevo, esto se repite a través del especial \ $ 0 variable.

Conclusión

En este artículo, exploramos el $$, ps?, $ 1, $ 2, etc., ps y \ $ 0 variables, cómo funcionan y cómo puede usarlas directamente desde la línea de comando o desde los scripts. Hay algunas otras variables especiales, pero estas son las principales variables especiales en Bash que he usado a lo largo de muchos años de codificación bash. Disfrutar!

Tutoriales de Linux relacionados:

  • Recuperación de páginas web con WGET, CURL y LYNX
  • Manipulación de Big Data para la diversión y las ganancias Parte 1
  • Manipulación de Big Data para diversión y ganancias Parte 3
  • Ejemplos de Linux Complex Bash One-Liner
  • Manipulación de Big Data para diversión y ganancias Parte 2
  • Bucles anidados en guiones Bash
  • Mastering Bash Script Loops
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Bash Loops con ejemplos