7

複数のファイルを処理する bash スクリプトを作成しました。構成ファイルのサポートを追加したいと思います。これは私の望んでいたデータ構造です:

Array ( 
    [0] => Array (
        [name] => datset1
        [path] => /var/lib/bliTool/ds1
        [type] => cvs
    )

    [1] => Array (
        [name] => datset2
        [path] => /var/lib/bliTool/ds2
        [type] => xml
    )

    [2] => Array (
        [name] => datset3
        [path] => /home/igor/test/ds3
        [type] => cvs
    )
)

Q1 bash 内でそのようなデータ構造は可能ですか? 他の推奨事項はありますか?これは設定ファイルにあるはずです...

Q2:「セット」ごとに 1 つの構成ファイルについて考えています。

/etc/myApp/
/etc/myApp/myApp.conf
/etc/myApp/datasets.d/
/etc/myApp/datasets.d/ds1.conf
/etc/myApp/datasets.d/ds2.conf
/etc/myApp/datasets.d/dsN.conf

/etc/myApp/datasets.d/dsN.confファイルは次のようになります

name=The DS name
path=/the/path/to/the/ds/files
type=thetype

おすすめは何ですか?1 つのファイルですべてを行う方法はありますか?

Q3:セットごとに複数のパス値をサポートしたいと考えています。私は何かをサポートすることができます

path="/first/path /second/path"

でも、スペースだと困ると思うので、区切り記号とか導入した方がいいと思います。

path="/first/path:/second/path"

文字列を分割します。

それとももっと良い方法がありますか?

4

2 に答える 2

14

でデータ構造をネストすることはできませんbash。せいぜい、連想配列の名前を配列に格納し、間接フープをジャンプしてそれらにアクセスすることができます。

$ declare -A aa0=([name]=dataset1 [path]=/var/lib/bliTool/ds1 [type]=cvs )
$ declare -A aa1=([name]=dataset2 [path]=/var/lib/bliTool/ds2 [type]=xml )
$ declare -A aa2=([name]=dataset3 [path]=/home/igor/test/ds3 [type]=cvs )

$ declare -a array=( aa0 aa1 aa2 )
$ tmp=aa0[name]
$ echo ${!tmp}
dataset1  

2 番目の質問については、構成ファイルの形式をセクションで定義することは確かに可能ですが、それを処理できるパーサーを作成する必要があります。他の言語には通常、豊富な構成ファイル形式を解析するために使用できるライブラリがあります。

変数ごとに複数のパスがある限り、に固執し:ます。理論的には、任意の区切り文字をパス名コンポーネントの一部として使用できるため、パスの一部である場合は区切り文字を引用符で囲む必要があります。しかし、区切り文字としてPATH使用するため、パス名で使用するのに適した文字ではなく、- のようなパラメーターで引用する必要があるという:歴史的な認識があります。:PATH

path="/first/poor\:path\:name:/second/bad\:path\:name"

次に、バックスラッシュを処理するのはアプリケーション次第:です。

于 2013-03-28T15:18:30.380 に答える
1

私は同様の状況に陥りましたが、私の解決策は、異なるレベル内で異なる IFS を使用することです。これは、chepner のアイデアに何らかの形で似ています。コードとサンプルは、https://github.com/pppoe/Nested-Array-Bash/にあります。

于 2013-04-24T22:00:35.983 に答える