เขียนอาร์เรย์เริ่มต้นให้กับตัวแปรใน Bash


10

ผมคาดหวังว่า

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

ที่จะเป็นอาร์เรย์ถ้า$excludesว่างเปล่า น่าเสียดายที่สิ่ง:-ต่อไปนี้ถูกใช้เป็นสตริง ฉันพลาดความผิดพลาดทางไวยากรณ์หรือไม่หรือฉันต้องใช้ clunky

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

?

คำตอบ:


9

คุณสามารถสร้างอาเรย์จากอาเรย์อื่นด้วยไวยากรณ์นี้:

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

ที่สามารถแปลเป็นไวยากรณ์ค่าเริ่มต้นนี้:

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

ฉันได้ทดสอบเคสแบบขอบบางอย่างเช่นสมาชิกอาเรย์ที่มีช่องว่างหรือบรรทัดใหม่ในนั้นและดูเหมือนว่าจะจัดการได้อย่างถูกต้อง


2
ถ้า arr2 ว่างเปล่า arr1 จะกลายเป็นอาร์เรย์ความยาวหนึ่งด้วยสตริงว่างหนึ่งอัน
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.