スクリプト内で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
どうして ?
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
配列はbash固有です。環境変数は名前と値のペアです。
環境変数の仕様 を読みます。
環境変数の値は文字列です。 C言語プログラムの場合、プロセスと呼ばれるときに、環境と呼ばれる文字列の配列が利用可能になります。配列は、次のように定義される外部変数environによってポイントされます。
extern char **environ;
これらの文字列の形式はname = value;です。 namesには文字「=」を含めないでください。