GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo cambiar el nombre de una variable Bash en un bucle y luego expandir el nombre cambiado?

Estoy tratando de expandir las variables Bash. He buscado pero no estoy seguro de cuáles son los términos de búsqueda para lo que intento hacer.
Aquí está mi código.
Dos preguntas:

  1. ¿Cómo obtengo el resultado deseado como se muestra?
  2. ¿Cuál es la terminología de Bash para describir lo que quiero aquí?
# Set Library install directories
install_dir_1=~/Desktop/arduino-1.8.4
install_dir_2=~/Desktop/arduino-1.8.5
install_dir_3=~/Desktop/arduino-1.8.5a

x=0

while [ $x -lt 4 ]; do

    let x=x+1 

    install_dir=install_dir_$x
    #echo $install_dir

    install_dir=$install_dir   
    #echo $install_dir

    dir_Adafruit_SSD1306=$install_dir/libraries/Adafruit_SSD1306/
    echo $dir_Adafruit_SSD1306

done

La salida real es

install_dir_1/libraries/Adafruit_SSD1306/
install_dir_2/libraries/Adafruit_SSD1306/
install_dir_3/libraries/Adafruit_SSD1306/
install_dir_4/libraries/Adafruit_SSD1306/

La salida deseada es

~/Desktop/arduino-1.8.4/libraries/Adafruit_SSD1306/
~/Desktop/arduino-1.8.5/libraries/Adafruit_SSD1306/
~/Desktop/arduino-1.8.5a/libraries/Adafruit_SSD1306/

Respuesta aceptada:

Se llama desreferenciar variables y, si bien es posible, en realidad no es necesario aquí. Entonces, sí, podría usar el mismo enfoque y usar la desreferenciación como se muestra a continuación:

#!/bin/bash
# Set Library install directories
install_dir_1=~/Desktop/arduino-1.8.4
install_dir_2=~/Desktop/arduino-1.8.5
install_dir_3=~/Desktop/arduino-1.8.5a

x=1

while [ $x -lt 4 ]; do
    ## Set the instal_dir variable to point to the
    ## name of the variable you want to dereference
    install_dir="install_dir_$x"
    ## Dereference the variable using the ${!var} notation
    install_dir=${!install_dir}

    dir_Adafruit_SSD1306="$install_dir/libraries/Adafruit_SSD1306/"
    echo "$dir_Adafruit_SSD1306"
    let x=x+1 

done

Pero esto es realmente demasiado complejo. Aquí hay una versión simplificada que hace lo mismo:

#!/bin/bash
install_dirs=("~/Desktop/arduino-1.8.4" 
              "~/Desktop/arduino-1.8.5" 
              "~/Desktop/arduino-1.8.5a")

for((x=0;x<${#install_dirs[@]};x++)); do 
    install_dir=${install_dirs[$x]}
    echo "$install_dir"
done

Linux
  1. Cómo cambiar el nombre de la interfaz en CentOS/RHEL 8 usando prefixdevname

  2. ¿Cómo puedo contar la cantidad de caracteres en una variable Bash?

  3. ¿Cómo cambio el directorio en Git Bash con Git para Windows?

  4. ¿Cómo cambiar el administrador de escritorio predeterminado en Debian?

  5. ¿Cómo cambiar la resolución de Bash para una máquina virtual Debian?

Cómo incrementar y decrementar una variable en Bash (Contador)

Cómo cambiar el nombre de host en Debian 10

Cómo cambiar el nombre de host en Debian Linux

Consejos de Ubuntu:cómo cambiar la fecha y la hora en una computadora portátil o de escritorio

Cómo obtener el estado de salida de un bucle en bash

¿Cómo hacer que ls ordene por extensión de archivo y luego por nombre?