あるスクリプトからデフォルトスクリプトに変数をエクスポートし、インポートした変数の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
ため驚くことがあります)。 )。
機能的な変更は、ループ変数$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
間接変数参照を使用する必要があります。
パラメータの最初の文字が感嘆符(!)で、パラメータがnamerefでない場合は、間接参照レベルが導入されます。 Bash は残りの引数を拡張することによって形成された値を新しい引数として使用し、その値は元の引数の拡張ではなく残りの拡張に使用されます。これを間接拡張といいます。
フルーツカラー.sh:
#!/bin/bash
source fruitcolor.sh
echo "The color of $1 is ${!1}"
$ ./getfruitcolor.sh apple
The color of apple is Red