Bashの変数にデフォルトの配列を書き込む

Bashの変数にデフォルトの配列を書き込む

楽しみにしています。

excludes="${excludes:-( ${default_excludes[@]} )}"

空の場合は配列$excludes。残念ながら、次の内容は:-文字列と見なされます。いくつかの構文のバリエーションが欠落しているのでしょうか、それとも薄暗い構文を使用する必要がありますか?

if [ -z "${excludes:-}" ]
then
    excludes=( "${default_excludes[@]}" )
fi

答え1

次の構文を使用して、別の配列から配列を構成できます。

arr1=( "${arr2[@]}" )

これはデフォルトの構文に変換できます。

arr1=("${arr1[@]:-${arr2[@]}}")

スペースや改行文字を含む配列メンバーなど、いくつかの極端なケースをテストしましたが、正しく処理しているようです。

答え2

myが空になる可能性がありますが、setである状況が発生したため、arr2単純な解決策が見つかりません。したがって、関数とグローバル一時変数を使用する必要があります。しかし、bash 3.2とbash 4だけでなく、すべてのケースで動作します。

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=("${!default}")
  else
    TEMP_VAR=("${@}")
  fi
}

set_temp_array arr1 "${arr2[@]}"
arr1="${TEMP_VAR[@]}"

値をコピーするために間接配列参照を使用しましたが、TEMP_VARbashで間接配列割り当てを把握できないため、2行と一時変数があります。

set -eu外のファンのために

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=(${!default+"${!default}"})
  else
    TEMP_VAR=(${@+"${@}"})
  fi
}

set_temp_array arr1 ${arr2+"${arr2[@]}"}
arr1=(${TEMP_VAR+"${TEMP_VAR[@]}"})

関連情報