1. ホーム
  2. arrays

[解決済み] bashでグローバルを使用せずに配列を返すには?

2022-12-04 01:16:34

質問

配列を作成する関数があり、その配列を呼び出し元に戻したいのですが。

create_array() {
  local my_list=("a", "b", "c")
  echo "${my_list[@]}"
}

my_algorithm() {
  local result=$(create_array)
}

これでは、私は展開された文字列を得るだけです。 グローバルなものを使用せずにmy_listをquot;return"するにはどうしたらよいでしょうか?

どのように解決するのですか?

グローバルで何が問題なのでしょうか?

配列を返すのは本当に実用的ではありません。落とし穴がたくさんあります。

とはいえ、変数が同じ名前でもいいのであれば、ここに一つのテクニックがあります。

$ f () { local a; a=(abc 'def ghi' jkl); declare -p a; }
$ g () { local a; eval $(f); declare -p a; }
$ f; declare -p a; echo; g; declare -p a
declare -a a='([0]="abc" [1]="def ghi" [2]="jkl")'
-bash: declare: a: not found

declare -a a='([0]="abc" [1]="def ghi" [2]="jkl")'
-bash: declare: a: not found

declare -p コマンド(ただし f() は、デモンストレーションのために配列の状態を表示するために使用されます。で f() では、配列を返す仕組みとして使われています。

配列に別の名前が必要な場合は、このようにします。

$ g () { local b r; r=$(f); r="declare -a b=${r#*=}"; eval "$r"; declare -p a; declare -p b; }
$ f; declare -p a; echo; g; declare -p a
declare -a a='([0]="abc" [1]="def ghi" [2]="jkl")'
-bash: declare: a: not found

-bash: declare: a: not found
declare -a b='([0]="abc" [1]="def ghi" [2]="jkl")'
-bash: declare: a: not found