質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

3回答

1627閲覧

入れ子(ネスト)している変数の値を更新した際の動作について

jusco870103

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2018/11/07 11:04

ある変数Aが別の変数Bの中に入っている(ネスト)状態で、Aの値を変更した際の動作について、お伺いしたいことがございます。
お手数ですが、下記ご確認のほどお願い致します。

#前提・実現したいこと
・入れ子状態(B=${A})の変数のうち、元の変数Aの値を変更した際、先となる変数Bを展開した時の値に、変更後の値が入っている状態にしたい。

#発生している問題・エラーメッセージ
変数Aの値が更新されていない。

#該当のソースコード

bash

11 VAR1="aaa" 22 VAR2="${VAR1}_bbb" 33 echo ${VAL2} #aaa_bbbと出力される 44 VAR1="bbb" 55 echo ${VAL2} #bbb_bbbと出力されず、aaa_bbbとなる

#試したこと
echoの前にもう一度VAR2の宣言をしたところ実現しました。(後述)
ただし、現在作成しているスクリプトでは、VAR2にあたる変数が複数存在し、VAR1の値が変わるたびに再宣言しなくてはいけないので、
より容易に同じ効果のある方法があれば、ご教示のほどお願い致します。

bash

11 VAR1="aaa" 22 VAR2="${VAR1}_bbb" 33 echo ${VAL2} #aaa_bbbと出力される 44 VAR1="bbb" 55 VAR2="${VAR1}_bbb" #同じ値を再宣言する 66 echo ${VAL2} #bbb_bbbと出力される

#補足情報(FW/ツールのバージョンなど)
Red Hat Enterprise Linux Server release 7.5 (Maipo)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず、

ある変数Aが別の変数Bの中に入っている(ネスト)状態で、

という概念はありません。
VAR1の値がaaaの状態で、VAR2="${VAR1}_bbb"と書くと、VAR2="aaa_bbb"と書いたのと全く同じ意味と効果になります。

また、

echoの前にもう一度VAR2の宣言をしたところ実現しました。

VAR2="${VAR1}_bbb"は、VAR2の宣言ではありません。VAR2への(文字列の)代入です。

どうしたら良いかは状況に応じてケースバイケースでしょう。
他の方の回答にあるように、
evalを使う
・関数を使う
あるいは、
・その他の方法を使う

投稿2018/11/07 14:59

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco870103

2018/11/08 04:43

いつもありがとうございます。 おっしゃる通りで、今回のケースではevalで大丈夫でしたが、内容によっては関数化したほうが勝手がよいシチュエーションがあると現在のコードを見て理解できました。 宣言と代入は違うというご指摘も、ありがとうございます。
guest

0

VAR1, VAR2どちらも別な文字列として格納されているので無理かと思います。

やるのであればVAR1への代入を関数化し、関数内でVAR2を書き換えるとか、
VAR2表示前に必ずVAR1を入れるようにするとか、そういう方法を取るしか無いかと。

↓ 代入を関数化

bash

1#!/bin/bash 2 3var1() { 4 VAR1=$1 5 VAR2="${VAR1}_bbb" 6} 7 8var1 "aaa" 9echo $VAR2 10var1 "bbb" 11echo $VAR2

↓ 表示を関数化

bash

1#!/bin/bash 2 3print_var2() { 4 echo "${VAR1}_${VAR2}" 5} 6 7VAR1="aaa" 8VAR2="bbb" 9print_var2 10VAR1="bbb" 11print_var2

投稿2018/11/07 11:28

編集2018/11/07 11:29
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco870103

2018/11/08 04:46

ご回答下さり、ありがとうございます。 本件では関数化するよりかはevalを使用するほうが簡単だったのですが、代入や表示を関数化する発想がもともと無かったので、大変参考になりました。 また分からないことが合った場合は、お手間おかけしますが、引き続き宜しくお願い致します。
guest

0

ベストアンサー

こんな漢字で、

bash

1$ VAR1='aaa' 2$ VAR2='${VAR1}_bbb' 3$ eval echo ${VAR2} 4aaa_bbb 5$ VAR1='bbb' 6$ eval echo ${VAR2} 7bbb_bbb

投稿2018/11/07 13:32

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco870103

2018/11/08 04:49

ご回答下さり、ありがとうございます。 変数をシングルクォートで囲む&evalをつけてコマンド実行でできるのですね。 現行のコードではhichon様のご回答が、一番簡単に実現ができたのでベストアンサーにさせて頂きました。 また分からないことがあった際は、お手数おかけしますがご回答頂けましたら幸いです。 改めて、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問