bashは一時変数を生成する代わりに文字列の間接拡張を使用できますか?

bashは一時変数を生成する代わりに文字列の間接拡張を使用できますか?

私たち全員が読んだと仮定するとhttps://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html(具体的に検索してみてください。間接拡張)。

質問は、次のことを行うのではなく、次のことを意味します。

alpha_date=1563980822; alpha_hash=bfc1a9ad; alpha_url=http://example.com/bfc1a9ad; alpha_path=/build/alpha; alpha_status=failure; bravo_date=1563981822; bravo_hash=f76025c5; bravo_url=http://example.com/f76025c5; bravo_path=/build/alpha2; bravo_status=success; charlie_date=1563982822; charlie_hash=289f55fd; charlie_url=http://example.com/289f55fd; charlie_path=/build/charlie; charlie_status=success

for prefix in alpha bravo charlie; do
    for suffix in date hash url path status; do
        tempvar="${prefix}_${suffix}"
        echo -n "$tempvar: ${!tempvar}"$'\t'
    done
    echo
done

これは働き、出力されます:

alpha_date: 1563980822      alpha_hash: bfc1a9ad      alpha_url: http://example.com/bfc1a9ad      alpha_path: /build/alpha        alpha_status: failure
bravo_date: 1563981822      bravo_hash: f76025c5      bravo_url: http://example.com/f76025c5      bravo_path: /build/alpha2       bravo_status: success
charlie_date: 1563982822    charlie_hash: 289f55fd    charlie_url: http://example.com/289f55fd    charlie_path: /build/charlie    charlie_status: success

tempvar次のような作成をスキップしたいと思います。

for prefix in alpha bravo charlie; do
    for suffix in date hash url path status; do
        echo -n "${prefix}_${suffix} is ${!${prefix}_${suffix}}"$'\t'
    done
    echo
done

しかし、もちろんbad substitutionbashでエラーが発生しました。

bashを行う方法はありますか?「間接拡張」「ロープ」に?

ベストアンサー1

変数の設定方法にはいくつかの(read "$a$b"、など)があります。printf -v "$a$b" ...declare "$a$b"=...

値を読み取るには、最終値が数値の場合は算術拡張を使用します。算術拡張は入れ子になる可能性があるためですが、次も参照してください。シェル算術評価における整理されていないデータ使用のセキュリティ影響):

$ a=a b=cd acd=10
$ echo $(($a$b))
10

通常、bashはネストした置換をサポートしません。

もちろん、おもちゃの例をある程度模倣することができます。

for prefix in alpha bravo charlie; do
    for suffix in date hash url path status; do
        declare -p "${prefix}_${suffix}"
    done
done

または、次のことを試すことができますeval

eval "echo \"${prefix}_${suffix} is \${${prefix}_${suffix}}\""

おすすめ記事