別のスクリプトから変数をインポートするスクリプトに渡された引数の値を取得します。

別のスクリプトから変数をインポートするスクリプトに渡された引数の値を取得します。

あるスクリプトからメイン スクリプトに変数をエクスポートし、インポートした変数の 1 つを引数としてメイン スクリプトに渡そうとしています。

fruitcolour.sh以下は変数のみを持つスクリプトです:

apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"

メインのスクリプトは次のとおりですGetFruitColour.sh

#!/bin/bash

source fruitcolour.sh

echo "The colour of " $@ " is " $@ "."

引数として渡すためにapple、変数の値を取得したいのappleですRed

だから、走るときは./GetFruitColour.sh apple

出力は次のようになります::The colour of apple is Red.

答え1

これを実現する 1 つの方法は、間接参照、つまり最初の変数の値から別の変数を参照することです。

実証するには:

apple="Red"
var="apple"
echo "${!var}"

結果:

Red

bash はまず を として変数!varの値を意味しvar、それが を介して解釈${apple}され に変換されるからですRed

その結果、GetFruitColour.sh スクリプトは次のようになります。

#!/bin/bash

source ./fruitcolour.sh

for arg in "$@"
do
  printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done

ファイルの場所をより明確にするために、ソース スクリプトへのパスを単純ではなく相対的にしました (指定されたファイル名にスラッシュが含まれていない場合、シェルは変数を検索しますが$PATH、驚くかもしれません)。

私もechoに変更printf

機能的な変更は、ループ変数$argとその間接的な展開を使用して目的の値を生成することです。

$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.

ここではエラーチェックが行われていないことに注意してください。

$ ./GetFruitColour.sh foo
The colour of foo is .

連想配列を使用する方が簡単かもしれません:

declare -A fruits='([orange]="Orange" [apple]="Red" [mango]="Yellow" [pear]="Green" )'

for arg in "$@"
do
  if [ "${fruits["$arg"]-unset}" = "unset" ]
  then
    echo "I do not know the color of $arg"
  else
    printf 'The colour of %s is %s.\n' "$arg" "${fruits["$arg"]}"
  fi
done

答え2

間接変数参照を使用する必要があります。

パラメータの最初の文字が感嘆符 (!) で、パラメータが名前参照でない場合は、間接レベルが導入されます。Bash は、パラメータの残りの部分を展開して形成された値を新しいパラメータとして使用します。次に、この値が展開され、元のパラメータの展開ではなく、展開の残りの部分で使用されます。これを間接展開と呼びます。

フルーツカラー.sh:

#!/bin/bash

source fruitcolor.sh

echo "The color of $1 is ${!1}"

$ ./getfruitcolor.sh apple
The color of apple is Red

関連情報