ไปจาก String ไปยัง Array ของ "words" ใน Bash


11

ฉันต้องไปจากสตริงไปยังอาร์เรย์ที่แต่ละรายการเป็นแต่ละคำในสตริงนั้น ตัวอย่างเช่นเริ่มต้นด้วย:

VotePedro="Vote for Pedro"

ฉันต้องการอาร์เรย์:

Vote
For
Pedro

ซึ่งฉันควรจะสามารถย้ำกว่าเป็น:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done

คำตอบ:


11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

คุณสามารถอธิบายสิ่งที่วงเล็บและวงเล็บทำอย่างไร ฉันใหม่กับ BASH และต้องการที่จะเข้าใจว่าทำไมสิ่งนี้ถึงได้ผล
farid99

1
อาร์เรย์มักจะประกาศโดยใช้วงเล็บ ตัวอย่างเช่นvotePedroArray=("Vote" "For" "Pedro")จะให้คุณมีอาร์เรย์ความยาว 3 และ${VotePedro}เหมือนกับ$VotePedroในบริบทนี้ ในการเข้าถึงองค์ประกอบอาเรย์แต่ละรายการคุณสามารถใช้วงเล็บคล้ายกับสิ่งที่คุณมีสำหรับลูปสำหรับคำถามของคุณ เช่น${votePedroArray[0]}เป็นองค์ประกอบแรกในอาร์เรย์ ("โหวต" สำหรับตัวอย่างนี้)
airfishey

ขอบคุณสำหรับคำตอบ. ฉันอยากโหวต แต่ฉันยังไม่มีชื่อเสียงเพียงพอ
farid99

2
และย้ำเหนือพวกเขา: สำหรับการลงคะแนนใน $ {votePedroArray [@]}; ทำ echo $ vote เสร็จสิ้น
Neil McGill

4

เมื่อคุณปล่อยส่วนขยายตัวแปรไว้โดยไม่มีการอ้างอิงเช่น$VotePedroจะทำขั้นตอนต่อไปนี้:

  1. ค้นหาค่าของตัวแปร
  2. แยกค่าที่ช่องว่างแต่ละบล็อกลงในรายการสตริง โดยทั่วไปตัวคั่นเป็นอักขระในค่าของIFSตัวแปร โดยค่าเริ่มต้นคือพื้นที่แท็บและขึ้นบรรทัดใหม่
  3. ตีความแต่ละองค์ประกอบของรายการเป็นรูปแบบสัญลักษณ์แทน สำหรับแต่ละองค์ประกอบถ้ารูปแบบตรงกับบางไฟล์ให้แทนที่องค์ประกอบนั้นด้วยรายการชื่อไฟล์ที่ตรงกัน

ดังนั้นคุณสามารถแยกสตริงออกเป็นองค์ประกอบที่คั่นด้วยช่องว่าง (สมมติว่าเป็นค่าเริ่มต้นIFS) โดยปิดการขยายสัญลักษณ์แทนและขยายตัวแปรที่มีค่าเป็นสตริงนั้นนอกเครื่องหมายคำพูด

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do 

คุณสามารถแยกส่วน ณ จุดใช้งานได้โดยตรง สิ่งนี้จะใช้ได้แม้ในเชลล์เช่น sh ที่ไม่มีอาร์เรย์:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f

0

นอกจากนี้$IFSคุณยังสามารถทำลายมันได้ทุกอย่างที่คุณต้องการ:

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

... ซึ่งจะอนุญาตให้ช่องว่างคั่นเขตข้อมูลว่างได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.