7

この方法で配列を環境変数として設定します。脚本test.sh

test.sh で

#!/bin/bash
export STRING=( "str1" "str2" )

ソース test.sh

今スクリプトでtest-1.sh

#!/bin/bash
echo ${STRING[0]}

応答は何もなく、単なる空白行ですがSTRING="str1"、test.sh で設定して で実行しようとするecho $STRINGtest-1.sh、これは機能します。

テストは root ユーザーからのみ実行されます。配列を env variable として設定して、必要に応じて配列の要素を呼び出す方法を教えてください。以前、私は変更を試みましたが、/etc/bashrcそれも良い結果にはなりませんでした。

これらの変数設定を使用する必要がある多くのスクリプトを作成する必要があるため、配列をenv変数として設定する必要があります。

私が間違っているところを修正するための提案を誰かに提供できますか?

4

5 に答える 5

10

細かいマニュアルの「バグ」セクションを読んでください。

配列変数は(まだ)エクスポートされない場合があります。

しかし、多くの人がこれを実際のバグと見なしていることを私は知りません。kshスタイルの配列をサポートする他のシェルも、それらをエクスポートすることを許可していません。

パラメータや変数、または環境を介して、配列定義をかなり簡単に渡すことができます。ただし、通常はあまり役に立ちません。

function f {
    unset -v "$2"
    typeset "$2"
    eval "${!1}"
    typeset -p "$2"
}

typeset -a a=(a b c)
myArr=$(typeset -p a) f myArr a
于 2012-12-31T10:46:32.183 に答える
2

誤解は、環境変数はシェルによってのみ使用されると考えていることです-実際には使用されていません。読み取り専用、整数、配列などの属性は、環境ブロックにエクスポートできません。環境変数は、C、C++、Perl、Java、Python、PHP などの任意の言語で読み取ることができます。それらは Windows にも存在します。

では、別の言語で Bash 固有の属性をサポートするにはどうすればよいでしょうか? 配列値がまったくエクスポートされない Bash を除いて、すべての環境変数は文字列に変換されます。

Korn シェルは最初の要素だけをエクスポートします。ksh93 はexec、Korn シェルの子にエクスポートされた変数属性を保持するために、いくつかの悪用も行います。

ところで、変数名に大文字を使用することは、シェルで使用されるものと衝突する可能性があるため、悪い習慣と見なされています。また、Bash 3 では、エクスポート時に STRING という名前に問題があります (Bash 4 で修正されました)。

于 2012-12-31T12:11:03.040 に答える
1

プロセスからその子プロセスに渡される環境変数は、構造化されていない文字列です。配列はサポートできません。これは Bash で実証できます。

export x=foo
printenv x

それは を出力しますfoo。私が今x、配列になる場合

x=(foo bar)
printenv x

出力が表示xされません ( はエクスポートされません)。

于 2017-05-18T11:17:06.830 に答える
0

配列を環境変数に入れようとしていますが、環境変数は文字列のみです。bashには、配列を適切にシリアル化/逆シリアル化する方法がありません。手動で行ってください。

于 2012-12-31T10:43:54.520 に答える