Tulis array default ke variabel di Bash


10

Saya mengharapkan

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

menjadi array jika $excludeskosong. Sayangnya barang setelah :-diambil menjadi string. Apakah saya melewatkan contortion sintaksis, atau apakah saya harus menggunakan clunky

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

?

Jawaban:


10

Anda dapat membuat array dari array lain dengan sintaks ini:

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

Itu dapat diterjemahkan ke dalam sintaks nilai default ini:

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

Saya telah menguji beberapa kasus tepi, seperti anggota array dengan spasi atau baris baru di dalamnya dan tampaknya menanganinya dengan benar.


3
Jika arr2 adalah kosong, arr1 menjadi array dengan panjang satu dengan satu string kosong
Andy

2

Karena saya memiliki kasing di mana saya arr2mungkin kosong, tetapi ditetapkan, saya tidak dapat menemukan solusi sederhana. Jadi saya harus pergi dengan fungsi dan variabel temp global. Tapi itu bekerja di setiap kasus dan di bash 3.2 dan 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[@]}"

Saya menggunakan referensi array tidak langsung untuk menyalin nilai-nilai TEMP_VAR, tetapi saya tidak bisa menemukan penugasan array tidak langsung dalam bash, karenanya dua baris dan variabel temp

Bagi Anda set -eupenggemar di luar sana

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[@]}"})
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.