スクリプトに渡されたパラメータ値を取得し、他のスクリプトから変数を取得する

スクリプトに渡されたパラメータ値を取得し、他のスクリプトから変数を取得する

あるスクリプトからデフォルトスクリプトに変数をエクスポートし、インポートした変数の1つをパラメータとしてデフォルトスクリプトに渡したいと思います。

以下は変数のみを含むスクリプトですfruitcolour.sh

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

これは主なスクリプトですGetFruitColour.sh

#!/bin/bash

source fruitcolour.sh

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

appleパラメータとして渡すために変数の値を取得したいです。appleRed

だから私が走るとき./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

おすすめ記事