web-dev-qa-db-ja.com

配列を環境変数として使用できません

スクリプト内でenv配列変数を使用できない理由がわかりません。
私の~/.bashrcまたは~/.profile

export HELLO="ee"
export HELLOO=(aaa bbbb ccc)

シェルで:

> echo $HELLO
ee
> echo $HELLOO
aaa
> echo ${HELLOO[@]}
aaa bbbb ccc

スクリプトで:

#!/usr/bin/env bash
echo $HELLO
echo $HELLOO
echo ${HELLOO[@]}
---
# Return 
ee

どうして ?

4
user4912329

bash配列は、環境変数であってはなりません。環境変数は、キーと値の文字列のペアのみであるためです。

シェルが$PATH変数を使用して実行するのと同じように実行できます。これは基本的にパスの配列です。配列の値に他の方法では存在しない特定の文字で区切られた文字列に配列を変換します。

$ arr=( aa bb cc "some string" )
$ arr=$( printf '%s:' "${arr[@]}" )
$ printf '%s\n' "$arr"
aa:bb:cc:some string:

または、きちんと、

arr=( aa bb cc "some string" )
arr=$( IFS=:; printf '%s' "${arr[*]}" )
export arr

${arr[*]}の展開は、arrの最初の文字で区切られたIFS配列の要素であり、ここでは:に設定されます。このようにすると、文字列の要素は:によってseparated(not delimited)になるため、次のことはできません。空の要素がある場合は、最後に空の要素を区別します。


環境変数を使用してスクリプトに値を渡す代わりに、(明らかに?)コマンドライン引数を使用します。

arr=( aa bb cc )

./some_script "${arr[@]}"

次に、スクリプトは、位置パラメータ$1$2$3などを使用するか、$@を使用して、渡された引数に1つずつアクセスします。

printf 'First I got "%s"\n' "$1"
printf 'Then  I got "%s"\n' "$2"
printf 'Lastly there was "%s"\n' "$3"

for opt in "$@"; do
    printf 'I have "%s"\n' "$opt"
done
14
Kusalananda

配列はbash固有です。環境変数は名前と値のペアです。

環境変数の仕様 を読みます。

環境変数の値は文字列です。 C言語プログラムの場合、プロセスと呼ばれるときに、環境と呼ばれる文字列の配列が利用可能になります。配列は、次のように定義される外部変数environによってポイントされます。

extern char **environ;

これらの文字列の形式はname = value;です。 namesには文字「=」を含めないでください。

4
Wildcard