ループ内のBash変数名を変更してから変更された名前を拡張するにはどうすればよいですか?

ループ内のBash変数名を変更してから変更された名前を拡張するにはどうすればよいですか?

Bash変数を拡張しようとしています。私は検索しましたが、私が望むことを達成するためのクエリが何であるかわかりません。ここに私のコードがあります。 2つの質問:

  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

おすすめ記事