ฉันจะอ่านอินพุตของผู้ใช้เป็นอาร์เรย์ในbash
เชลล์ได้อย่างไร?
./array_test.sh < war_and_peace.txt
หรือเพียงแค่
ฉันจะอ่านอินพุตของผู้ใช้เป็นอาร์เรย์ในbash
เชลล์ได้อย่างไร?
./array_test.sh < war_and_peace.txt
หรือเพียงแค่
คำตอบ:
นี่เป็นวิธีหนึ่งในการทำ:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
หากคุณเรียกใช้มันจะทำการอ่านจากอินพุตมาตรฐานจนกว่าคุณจะกด Ctrl + D (EOF) my_array
หลังจากนั้นสายที่คุณป้อนจะอยู่ใน บางคนอาจพบว่ารหัสนี้ทำให้เกิดความสับสน my_array = my_array + element
ร่างกายของวงโดยทั่วไปว่า
เอกสารที่น่าสนใจบางส่วน:
manpage ของการอ่าน builtin
15 ตัวอย่างอาร์เรย์จาก thegeekstuff.com
read -r
ค่อนข้างมีประโยชน์ / สำคัญในบางครั้ง ... ลิงก์ของ Stefano ไปที่ "read builtin manpage" อธิบายถึงวัตถุประสงค์ ... (เพื่อป้องกันการตีความเครื่องหมายทับขวา)
อ่านโดยใช้สิ่งนี้:
read -a arr
และสำหรับการพิมพ์ให้ใช้:
for elem in ${arr[@]}
do
echo $elem
done
และอีกอันที่ไม่ได้สร้างอาร์เรย์ขึ้นใหม่ทุกครั้ง (แต่ต้องใช้ 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
เกินไป ...
วิธีการเกี่ยวกับหนึ่งซับนี้)
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
ซึ่งเป็นวิธีที่ง่ายและอื่น ๆ ตรงไปข้างหน้ามากกว่าการแก้ปัญหาใด ๆ ที่ได้รับจากคำตอบของค่าตัวแปรอ่านเข้าไปในเปลือกจากท่อและในทุบตีอ่านหลังจากที่ท่อไม่ได้ตั้งค่าค่า
cat war_and_peace.txt | ./array_test.sh
คำตอบของฉันยังจะทำงานร่วมกับการดำเนินการเช่น