楽しみにしています。
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_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[@]}"})