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:
- ¿Cómo obtengo el resultado deseado como se muestra?
- ¿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