2016-12-20 8 views
0

以前は、ある変数を生成する際に、扱いに役立ついくつかの助けがありました。変数を関数外で使用可能にする

私が今問題にしているのは、このプロシージャが関数として保持され、宣言がその関数内にあることです。

関数の外で宣言された変数を使用する方法はありますか?私は問題がで

宣言を使用している...空白行は、上記の機能

getVARS() { 

while IFS== read -r name value; do 
    if [[ $name == \#* ]] || [[ $name == \-\-* ]]; then 
     echo $name" ignored" 
    else 
     declare -x "$name=$value" 
    fi 
done < /home/admin/file.dat 

unset IFS 

} 

を返された別のスクリプトで開催され、このように呼ばれて

. /home/admin/functions 

getVARS 
echo "$VarA" 
+0

これらの変数を関数外で宣言してみてください。こうすれば、関数の範囲内に値が割り当てられ、関数が完了すると値が表示されます。 – FDavidov

+0

変数の保存/復元、または名前付きパイプの使用が可能です。関数の出力を他のコマンドにパイプすることができます。単一の値のみが必要な場合は、値を返すこともできます。 –

+0

コメントありがとうございます。私はファイルから読み込まれたすべての変数を必要としますが、私は理想的にはそれらをきれいさのための関数として保持したいと思っています。私はそれの機能部分を剥ぎ取り、必要に応じてスクリプトにそれを含めることができると思います。 –

答えて

1

を取得しますあなたが読むことができると宣言した人:

関数で使用すると、それぞれの名前をlo cal、 ローカルコマンドの場合と同様です。

あなたは、関数の外で使用したいのであれば、あなたは使用することができます。

eval $name=$value 

または

export $name=$value 
+0

ありがとう、両方のオプションが動作します。 evalまたはexportを使用するメリットを尋ねることはできますか?または違いはありませんか? –

+0

'eval'を使わないでください。たとえば、 'name = foo'と' value = '3; echo hi''の場合、 'nameの値は' 3; echo hi'ではありません。それは '3'で、' echo hi'が実行されます。 – chepner

+0

@RichardCすべての子プロセスをエクスポートすると、宣言されたvarが表示されます –

1

bash 4.2以降では、あなたが作るためにdeclare-gオプションを追加することができますローカルではなくグローバル変数

getVARS() { 

    while IFS== read -r name value; do 
    if [[ $name == \#* ]] || [[ $name == \-\-* ]]; then 
     echo $name" ignored" 
    else 
     declare -gx "$name=$value" 
    fi 
    done < /home/admin/file.dat 
} 

IFSの設定を解除する必要はありません。 readの直前に割り当てを行う目的は、そのコマンドの変更をローカライズすることです。

関連する問題