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 인 배열이됩니다.
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에서 간접 배열 할당을 파악할 수 없으므로 두 줄과 temp 변수

당신을 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.