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

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

なぜスクリプトで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

なぜ?

ベストアンサー1

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[*]}ここではに設定されます。これにより、文字列の要素は次のようになります。arrIFS:分離(いいえ分離)by :、これは末尾の空の要素(存在する場合)を区別できないことを意味します。


環境変数を使用してスクリプトに値を渡すもう1つの方法は、(明らかに?)コマンドライン引数を使用することです。

arr=( aa bb cc )

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

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

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

おすすめ記事