2015-11-02 13 views
6

bashスクリプトを書くときには、グローバル変数をいくつかの異なる場所で宣言するのではなく、その引数に基づいて演算を実行する自己完結型関数を書いています。コードは読みやすさを低下させます。ファイル内のすべての変数をbashで表示する

問題は、いくつかの変数を使用する必要がある関数がある場合に発生します。関数に10個の変数のようなものを渡すことは単純で醜いです。単純な連想配列を使うことができます。

我々は外部ファイルにこれらの変数を宣言したい場合は、「ソース」コマンドは、あなたがそれらをすべてインポートすることができます。

問題、その後、私はこれだけ、このファイル内で宣言された変数をリストしないか、となり私はそれらと連想配列を作ることができますか? 私は "compgen"とループの組み合わせを使って変数のリストから連想配列を構築することができましたが、呼び出されたものにかかわらずファイル内の変数のみをリストする方法はありますそれらを介して私の配列を構築する?

+1

(doxygen、javadoc、および派生ツールの場合と同じように)ドキュメントの解析が簡単なコメント形式を使用することをお勧めします。 –

+1

設定ファイルのソースの前後で 'declare' /' set'の出力をいつでも比較できますか? =)あるいは、設定ファイルがその関数に固有のものであれば、配列を直接作成するだけです。関数に固有のものでなければ、正しい変数だけを使う方法が必要なので、関数が期待する変数名を取る "collect_args"関数を書いてください。 –

+0

ありがとう。 @EtanReisnerあなたの提案は、実際のファイルを解析する以外の方法では解決できないようだと思うかもしれません。 – ByteFlinger

答えて

0

あなたはこのように、たとえば、あなたのファイルにいくつかの変数の宣言構文についてのegrepを行い、それを切断することにより、変数名を得ることができます:あなたは、コンテンツのファイルを持っていた場合などの

egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}' 

この

#!/bin/bash 

A="test" 

somerandomfunction() { 
     echo "test function" 
     B="test" 
} 

#C="test" 

DEF="test" 
GHI1="test" 
JKL[1]="test" 
JKL['a']="test" 
JKL["b"]="test" 

は、上記のコマンドの出力は次のようになります。

A 
B 
DEF 
GHI1 
JKL[1] 
JKL['a'] 
JKL["b"] 

コマンドの説明:

  1. 小文字の任意の数および組み合わせを含む行の最初のegrep検索(a-z及び/又は大文字(A-Z)文字及び/又は角括弧(\[\]および/またはシングル('\''および/またはダブル(")引用符の後に=が続きます。
  2. 第二のegrepは、通常、コメントとして解釈されるものので#で始まる行を除外し、生成または変数を設定しないであろう。
  3. cutコマンドは、=から行末までのすべてを削除します。
  4. awkコマンドは、スペースやタブ以外のものの最初の出現を表示します。したがって、変数名の前の空白スペースを効果的に切り捨てます。

コマンドの出力は次のようなループか何かで使用することができる。

for VAR in $(egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'); do 
    eval echo "\$${VAR}" 
done 
+0

私は通常、大文字の文字と数値を変数名に使用しますが、コードを読みやすくするためです。 :) – David

+1

ありがとう。できるだけ早くこれを調べていきます。 – ByteFlinger

0

これはawkを

egrepの "* =" ファイルを使用して、一つの方法である| awkを'-b'列の内容は次のとおりです。 'BEGIN {FS = "} {print $ 1}' | grep -v"# "|列-t

説明: 変数には値を代入するために"パターンgrepで "* ="をファイルから削除します。一度それは、私は "="と$ 1を使用する前に何かを印刷アウトフィールドの区切りを宣言するためにawkを使用しています。列-tは、出力を左に揃えるためのものです。

希望します。

+0

grep -v "#"は、コメント付きの変数を残します。コメント化された変数を同様に出力したい場合は、これを無視することができます –

0

変数を直接ファイルから取得するのはどうですか?

VARLIST=$(cut -d= -f1 file_with_variables) 
関連する問題