なぜスクリプトで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[*]}
ここではに設定されます。これにより、文字列の要素は次のようになります。arr
IFS
:
分離(いいえ分離)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