Bashで名前付き参照を使用して連想配列にアクセスできないようです。

Bashで名前付き参照を使用して連想配列にアクセスできないようです。
# SETUP PHP81 SYMLINKS
declare -A cgi=([path]="/opt/remi/php81/root/usr/bin/php-cgi" [filename]="php-cgi81")
declare -A config=([path]="/opt/remi/php81/root/usr/bin/php-config" [filename]="php-config81")
declare -A phpize=([path]="/opt/remi/php81/root/usr/bin/phpize" [filename]="phpize81")
declare -A pecl=([path]="/opt/remi/php81/root/usr/bin/pecl" [filename]="pecl81")
declare -A pear=([path]="/opt/remi/php81/root/usr/bin/pear" [filename]="pear81")

declare -a symlinks=("cgi" "config" "phpize" "pecl" "pear")

echo -en "[INFO]: Setting up PHP 8.1 symlinks\n"
cd /usr/bin

for symlink in "${symlinks[@]}";
do
    echo -en "[INFO]: Creating symlink for ${symlink}\n"

    # Get the array that matches the string in symlink
    props="$symlink[@]"
    # Print out the filename property eg cgi[filename], config[filename], phpize[filename]
    echo ${!props[filename]}




    echo -en "\n"

done

私に問題を引き起こすコードスニペットがあります。現在は出力されます。

./upgrade.sh 
[INFO]: Installing php81 packages
[INFO]: Setting up PHP 8.1 symlinks
[INFO]: Creating symlink for cgi
php-cgi81 /opt/remi/php81/root/usr/bin/php-cgi

[INFO]: Creating symlink for config
php-config81 /opt/remi/php81/root/usr/bin/php-config

[INFO]: Creating symlink for phpize
phpize81 /opt/remi/php81/root/usr/bin/phpize

[INFO]: Creating symlink for pecl
pecl81 /opt/remi/php81/root/usr/bin/pecl

[INFO]: Creating symlink for pear
pear81 /opt/remi/php81/root/usr/bin/pear

The expected output is 
./upgrade.sh 
[INFO]: Installing php81 packages
[INFO]: Setting up PHP 8.1 symlinks
[INFO]: Creating symlink for cgi
php-cgi8=

[INFO]: Creating symlink for config
php-config81

[INFO]: Creating symlink for phpize
phpize81

[INFO]: Creating symlink for pecl
pecl81

[INFO]: Creating symlink for pear
pear81

これで問題が解決しましたので、以下に解決策を投稿しましたが、誰かが私の解決策が気に入らず、反対投票しましたが、公開した解決策が機能しています。しかし、何を使うかはあなたが決めます。助けてくれてありがとう。

ベストアンサー1

連想配列の各インデックスに対して間接変数を生成する必要があります。

for symlink in "${symlinks[@]}";
do
    echo -en "[INFO]: Creating symlink for ${symlink}\n"

    f_var="${symlink}[filename]"
    p_var="${symlink}[path]"

    echo "filename=${!f_var}  path=${!p_var}"
done

もっと複雑になりたい場合などcgiを作りましょう。索引配列と関連配列を保存できます。索引特定の属性の場合:

i=0; declare -A idx=([path]=$((i++)) [filename]=$((i++)))
unset cgi; declare -a cgi=( "/opt/remi/php81/root/usr/bin/php-cgi" "php-cgi81")
symlink=cgi
props="${symlink}[@]"
values=("${!props}")
echo ${values[${idx[path]}]}     # => /opt/remi/php81/root/usr/bin/php-cgi
echo ${values[${idx[filename]}]} # => php-cgi81

declare -n symlink=cgiアップグレードすると、間違いなくはるかにきれいになります。

おすすめ記事