8

bash スクリプトを作成するときは、コード内のいくつかの異なる場所でグローバル変数を宣言して読みやすさを低下させるよりも、引数を取り、その引数に基づいて操作を実行する自己完結型の関数を作成するのが好きです。

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

これらの変数を外部ファイルで宣言したい場合は、「source」コマンドを使用してそれらをすべてインポートできます。

問題は、このファイル内でのみ宣言された変数をリストして、連想配列を構築できるようにするにはどうすればよいですか? 「compgen」とループの組み合わせを使用して、変数のリストから連想配列を作成することができましたが、名前に関係なく、ファイル内で見つかった変数のみをリストする方法があるため、ループすることができますそれらと私の配列を構築しますか?

4

3 に答える 3

2

ファイルでいくつかの変数宣言構文に対して 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. 2 番目の egrep は、a で始まる行を除外し#ます。これは、これらの行は通常コメントとして解釈され、変数を生成または設定しないためです。
  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
于 2015-11-17T15:11:58.347 に答える