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에서 간접 배열 할당을 파악할 수 없으므로 두 줄과 임시 변수가 있습니다.

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[@]}"})

관련 정보