ฉันมีอาร์เรย์ที่มีองค์ประกอบบางอย่าง แต่ฉันต้องการผลักดันรายการใหม่ไปยังจุดเริ่มต้นของอาร์เรย์ ฉันจะทำอย่างไร
ฉันมีอาร์เรย์ที่มีองค์ประกอบบางอย่าง แต่ฉันต้องการผลักดันรายการใหม่ไปยังจุดเริ่มต้นของอาร์เรย์ ฉันจะทำอย่างไร
คำตอบ:
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] , เราจะทำการรวมกับอาร์เรย์ย่อยด้านล่าง:
รับองค์ประกอบทั้งหมดด้วยดัชนีตำแหน่ง 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] ถึงสุดท้ายความเป็นไปได้อีกอย่างที่จะลบองค์ประกอบก็คือ
การใช้unset
(กำหนดค่า 'null' ให้กับองค์ประกอบจริง)
unset arr[2]
ใช้รูปแบบการแทนที่หากคุณรู้คุณค่าขององค์ประกอบของคุณ
arr=( "${arr[@]/PATTERN/}" )
arr+=(element)
และunset arr[2]
(ซึ่งควรเป็นunset -v 'arr[2]'
!) ซึ่งจะถือว่าอาร์เรย์ที่ไม่กระจัดกระจาย ยังทราบว่าarr=( "${arr[@]/PATTERN/}" )
จะไม่เปลี่ยนจำนวนองค์ประกอบ สิ่งที่สามารถทำได้คือแทนที่ด้วยสตริงว่าง
โปรดทราบว่าอาร์เรย์ในbash
(คัดลอกจาก ksh) เป็นอาร์เรย์ที่เชื่อมโยงกัน
a=(newvalue "$a[@]")
จะสร้าง$a
อาเรย์ใหม่ด้วยnewvalue
as ${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
# 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
}
ARRAY+=('foo')