ฉันจะอ่านอินพุตของผู้ใช้เป็นอาร์เรย์ใน Bash ได้อย่างไร


15

ฉันจะอ่านอินพุตของผู้ใช้เป็นอาร์เรย์ในbashเชลล์ได้อย่างไร?


ฉันคิดว่าคุณต้องการอ่านจาก stdin? cat war_and_peace.txt | ./array_test.shคำตอบของฉันยังจะทำงานร่วมกับการดำเนินการเช่น
Stefano Palazzo

./array_test.sh < war_and_peace.txtหรือเพียงแค่
Eliah Kagan

คำตอบ:


14

นี่เป็นวิธีหนึ่งในการทำ:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

หากคุณเรียกใช้มันจะทำการอ่านจากอินพุตมาตรฐานจนกว่าคุณจะกด Ctrl + D (EOF) my_arrayหลังจากนั้นสายที่คุณป้อนจะอยู่ใน บางคนอาจพบว่ารหัสนี้ทำให้เกิดความสับสน my_array = my_array + elementร่างกายของวงโดยทั่วไปว่า

เอกสารที่น่าสนใจบางส่วน:


3
read -rค่อนข้างมีประโยชน์ / สำคัญในบางครั้ง ... ลิงก์ของ Stefano ไปที่ "read builtin manpage" อธิบายถึงวัตถุประสงค์ ... (เพื่อป้องกันการตีความเครื่องหมายทับขวา)
Peter.O

10

อ่านโดยใช้สิ่งนี้:

read -a arr

และสำหรับการพิมพ์ให้ใช้:

for elem in ${arr[@]}
do 
  echo $elem
done

4

และอีกอันที่ไม่ได้สร้างอาร์เรย์ขึ้นใหม่ทุกครั้ง (แต่ต้องใช้ bash 3.1 หรือใหม่กว่า):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

ดูhttp://mywiki.wooledge.org/BashFAQ/001สำหรับข้อมูลเพิ่มเติม

และเช่นเคยเพื่อหลีกเลี่ยงการเขียนบั๊กโปรดอ่านhttp://mywiki.wooledge.org/BashGuideและหลีกเลี่ยงคำแนะนำ tldp-guide เช่นคำแนะนำการใช้สคริปต์ขั้นสูง bash


ลิงค์ดี ... ขอบคุณสำหรับการชี้ให้เห็นIFSปัญหา โดยไม่มีการลบล้างมัน 'อ่าน' sripts whitespace ชั้นนำและต่อท้ายทั้งหมด ... และแน่นอน-rเกินไป ...
Peter.O

0

วิธีการเกี่ยวกับหนึ่งซับนี้)

arr=( $(cat -) )
echo ${arr[@]}

แก้ไข:

ในbash,

arr=(val1 val2 ...)

เป็นวิธีของการกำหนดไปยังอาร์เรย์ ใช้ร่วมกับการทดแทนคำสั่งคุณสามารถอ่านในอาร์เรย์จากไปป์ไลน์ซึ่งเป็นไปไม่ได้ที่จะใช้readเพื่อให้บรรลุสิ่งนี้ในลักษณะตรงไปข้างหน้า:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

คุณจะพบว่ามันไม่มีอะไรส่งออกเนื่องจากความจริงที่readไม่ได้ทำอะไรเมื่อstdinเป็นท่อตั้งแต่ไปป์อาจจะทำงานใน subshell เพื่อให้ตัวแปรอาจไม่สามารถใช้งานได้เลย

ใช้วิธีที่แนะนำโดยคำตอบนี้:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

มันทำให้a bซึ่งเป็นวิธีที่ง่ายและอื่น ๆ ตรงไปข้างหน้ามากกว่าการแก้ปัญหาใด ๆ ที่ได้รับจากคำตอบของค่าตัวแปรอ่านเข้าไปในเปลือกจากท่อและในทุบตีอ่านหลังจากที่ท่อไม่ได้ตั้งค่าค่า


คุณทดสอบไหม
cmak.fr

@ cmak.fr ใช่มันใช้งานได้สำหรับฉัน
Quark

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