루프에서 Bash 변수 이름을 변경한 다음 변경된 이름을 확장하려면 어떻게 해야 합니까?

루프에서 Bash 변수 이름을 변경한 다음 변경된 이름을 확장하려면 어떻게 해야 합니까?

Bash 변수를 확장하려고 합니다. 검색했지만 내가 원하는 것을 달성하기 위한 검색어가 무엇인지 잘 모르겠습니다. 여기 내 코드가 있습니다. 두 가지 질문:

  1. 그림과 같이 원하는 출력을 얻으려면 어떻게 해야 합니까?
  2. 내가 원하는 것을 설명하는 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=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

실제 출력은

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

원하는 출력은

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

답변1

이것을 변수 역참조라고 하며, 가능하기는 하지만 여기서는 꼭 필요한 것은 아닙니다. 그렇습니다. 동일한 접근 방식을 사용하고 다음과 같이 역참조를 사용할 수 있습니다.

#!/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

하지만 정말 너무 복잡해요. 동일한 작업을 수행하는 단순화된 버전은 다음과 같습니다.

#!/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

관련 정보