Viết mảng mặc định thành biến trong Bash


10

Tôi đã mong đợi

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

là một mảng nếu $excludestrống. Thật không may, những thứ sau đó :-được coi là một chuỗi. Tôi đã bỏ lỡ một số mâu thuẫn cú pháp, hoặc tôi phải sử dụng clunky

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

?

Câu trả lời:


10

Bạn có thể xây dựng một mảng từ một mảng khác với cú pháp này:

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

Điều đó có thể được dịch sang cú pháp giá trị mặc định này:

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

Tôi đã thử nghiệm một số trường hợp cạnh, như các thành viên mảng có khoảng trắng hoặc dòng mới trong đó và dường như xử lý chúng một cách chính xác.


3
Nếu mảng 2 là một khoảng trống, thì mảng 1 trở thành một mảng có độ dài bằng một chuỗi trống
Andy

2

Vì tôi gặp trường hợp arr2có thể trống, nhưng được đặt, tôi không thể tìm ra giải pháp đơn giản. Vì vậy, tôi đã phải đi với một chức năng và biến temp toàn cầu. Nhưng nó hoạt động trong mọi trường hợp và trong bash 3.2 và 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[@]}"

Tôi sử dụng tham chiếu mảng gián tiếp để sao chép các giá trị vào TEMP_VAR, nhưng tôi không thể tìm ra một phép gán mảng gián tiếp trong bash, do đó hai dòng và biến temp

Dành cho các bạn set -euhâm mộ ngoài kia

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[@]}"})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.