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


10

私は期待していました

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

$excludesが空の場合は配列になります。残念ながら、後のもの:-は文字列と見なされます。構文のゆがみを逃したのですか、それとも不格好なものを使用する必要がありますか

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

回答:


10

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

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

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

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

スペースや改行が含まれている配列メンバーなど、いくつかのエッジケースをテストしましたが、正しく処理されるようです。


3
arr2が空の場合、arr1は1つの空の文字列を持つ長さ1の配列になります
Andy

2

私は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_VAR、bashでの間接配列割り当てを理解できなかったため、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[@]}"})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.