วิธีการเพิ่ม / ลบองค์ประกอบไปยัง / จากอาร์เรย์ในทุบตี?


43

ฉันมีอาร์เรย์ที่มีองค์ประกอบบางอย่าง แต่ฉันต้องการผลักดันรายการใหม่ไปยังจุดเริ่มต้นของอาร์เรย์ ฉันจะทำอย่างไร


คำตอบ:


47

เพื่อเพิ่มองค์ประกอบไปยังจุดเริ่มต้นของการใช้อาร์เรย์

arr=("new_element" "${arr[@]}")

โดยทั่วไปคุณจะทำ

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")

เพื่อเพิ่มองค์ประกอบในตอนท้ายของการใช้อาร์เรย์

arr=( "${arr[@]}" "new_element" )

หรือแทน

arr+=( "new_element" )

โดยทั่วไปคุณจะทำ

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )

เพื่อเพิ่มองค์ประกอบให้กับดัชนีเฉพาะของการใช้อาร์เรย์

สมมติว่าเราต้องการเพิ่มองค์ประกอบไปยังตำแหน่งของ Index2 arr [2] , เราจะทำการรวมกับอาร์เรย์ย่อยด้านล่าง:

  1. รับองค์ประกอบทั้งหมดก่อนที่ดัชนีindex2 arr [0]และarr [1] ;
  2. เพิ่มองค์ประกอบให้กับอาร์เรย์
  3. รับองค์ประกอบทั้งหมดด้วยดัชนีตำแหน่ง 2 ถึงarrสุดท้าย[2] , arr [3] , ....

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )

การลบองค์ประกอบออกจากอาร์เรย์

นอกเหนือจากการลบองค์ประกอบออกจากอาร์เรย์ (สมมติว่าองค์ประกอบ # 2) เราจำเป็นต้องเชื่อมต่อสองอาร์เรย์ย่อยเข้าด้วยกัน อาร์เรย์ย่อยแรกจะเก็บองค์ประกอบไว้ก่อนองค์ประกอบ # 2 และอาร์เรย์ย่อยที่สองจะมีองค์ประกอบหลังจากองค์ประกอบ # 2

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}จะได้รับสององค์ประกอบarr [0]และarr [1]เริ่มต้นจากจุดเริ่มต้นของอาร์เรย์
  • ${arr[@]:3}จะได้รับองค์ประกอบทั้งหมดจาก index3 arr [3] ถึงสุดท้าย

ความเป็นไปได้อีกอย่างที่จะลบองค์ประกอบก็คือ

  1. การใช้unset(กำหนดค่า 'null' ให้กับองค์ประกอบจริง)

    unset arr[2]
  2. ใช้รูปแบบการแทนที่หากคุณรู้คุณค่าขององค์ประกอบของคุณ

    arr=( "${arr[@]/PATTERN/}" )

2
โปรดทราบว่ายกเว้นarr+=(element)และunset arr[2](ซึ่งควรเป็นunset -v 'arr[2]'!) ซึ่งจะถือว่าอาร์เรย์ที่ไม่กระจัดกระจาย ยังทราบว่าarr=( "${arr[@]/PATTERN/}" )จะไม่เปลี่ยนจำนวนองค์ประกอบ สิ่งที่สามารถทำได้คือแทนที่ด้วยสตริงว่าง
Stéphane Chazelas

ดังนั้นเพื่อให้ส่วนการถอดออกทำงานคุณต้องค้นหาดัชนีใช่ไหม วิธีที่เร็วที่สุดในการค้นหาคืออะไร
qodeninja

3

โปรดทราบว่าอาร์เรย์ในbash(คัดลอกจาก ksh) เป็นอาร์เรย์ที่เชื่อมโยงกัน

a=(newvalue "$a[@]")

จะสร้าง$aอาเรย์ใหม่ด้วยnewvalueas ${a[0]}และองค์ประกอบของอาเรย์ดั้งเดิมต่อท้ายด้วยตัวเลขของคีย์ด้วยคีย์ 1, 2 ...

ตัวอย่างเช่นหากคุณมี:

bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")

นั่นอธิบายว่าทำไมไม่มีผู้ประกอบการในตัวสำหรับสิ่งนั้น

หากคุณต้องการที่จะแทรกnewvalueเป็น${a[0]}และเปลี่ยนปุ่มอื่น ๆ ทั้งหมดโดยหนึ่งคุณจะต้องมีอาร์เรย์ชั่วคราว:

b=newvalue
for k in "${!a[@]}"; do
  b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
  a[k]=${b[k]}
done
unset b

เชลล์ชอบzshหรือyashที่มีอาร์เรย์ปกติมีตัวดำเนินการสำหรับ:

  • zsh:

    a[1,0]=newvalue

    (ใช้ได้กับการเตรียมสตริงไปยังตัวแปรสเกลาร์)

  • yash:

    array -i a 0 newvalue

"อาร์เรย์ใน bash (คัดลอกมาจาก ksh) เป็นอาร์เรย์ที่ค่อนข้างเชื่อมโยง" ?? ฉันคิดว่ามี "ปกติ" (อาจจะกระจัดกระจาย) และเชื่อมโยง (ที่คุณสามารถใช้สตริงเป็น indecies) อาร์เรย์ในทุบตีฉันจะหายไป?
พฤศจิกายน

0
# array declaration  
arr=()  

#Function to read data from file a and add into array  
fun_add_in_array()
{  
input=$1  
while IFS=',' read -r f1 f2  
do  
    echo "Element1 : $f1"  
    echo "Element2 : $f2"  
    arr+=( "$f1" )  
done < "$input"  
}  

#Function to print a array  
fun_read_array()  
{  
arr=("$@")  
for i in "${arr[@]}"  
do  
    echo $i  
done  
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.