<ก่อนหน้านี้ | เนื้อหา | ถัดไป>
การเข้าถึง Array Elements
อาร์เรย์ดีสำหรับอะไร? งานการจัดการข้อมูลจำนวนมากสามารถทำได้ด้วยโปรแกรมสเปรดชีต งานเขียนโปรแกรมจำนวนมากสามารถทำได้ด้วยอาร์เรย์
ลองพิจารณาตัวอย่างการรวบรวมข้อมูลและการนำเสนออย่างง่าย เราจะสร้างสคริปต์ที่ตรวจสอบเวลาแก้ไขของไฟล์ในไดเร็กทอรีที่ระบุ จากข้อมูลนี้ สคริปต์ของเราจะแสดงตารางที่แสดงเวลาของวันที่แก้ไขไฟล์ครั้งล่าสุด สคริปต์ดังกล่าวสามารถใช้เพื่อกำหนดว่าระบบมีการใช้งานมากที่สุดเมื่อใด สคริปต์นี้เรียกว่า ชั่วโมง, ให้ผลลัพธ์นี้:
[me@linuxbox ~]$ ชั่วโมง .
ชั่วโมง | ไฟล์ | ชั่วโมง | ไฟล์ |
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
ไฟล์ทั้งหมด = 80
เราดำเนินการ ชั่วโมง โปรแกรมระบุไดเร็กทอรีปัจจุบันเป็นเป้าหมาย สร้างตารางแสดงจำนวนไฟล์ที่ถูกแก้ไขล่าสุดในแต่ละชั่วโมงในแต่ละวัน (0-23) รหัสในการผลิตนี้มีดังนี้:
#! / bin / ทุบตี
# ชั่วโมง: สคริปต์เพื่อนับไฟล์โดยใช้เวลาแก้ไข () {
echo "การใช้งาน: ${0##*/} ไดเรกทอรี" >&2
}
#! / bin / ทุบตี
# ชั่วโมง: สคริปต์เพื่อนับไฟล์โดยใช้เวลาแก้ไข () {
echo "การใช้งาน: ${0##*/} ไดเรกทอรี" >&2
}
# ตรวจสอบว่าอาร์กิวเมนต์เป็นไดเร็กทอรีถ้า [[ ! -d $1 ]]; แล้ว
การใช้งาน ทางออก1
fi
# เริ่มต้นอาร์เรย์
สำหรับฉันใน {0..23}; ทำชั่วโมง[i]=0; เสร็จแล้ว
# เก็บข้อมูล
สำหรับฉันใน $(stat -c %y "$1"/* | cut -c 12-13); ทำ j=${i/#0}
((++ชั่วโมง[j])) ((++นับ))
ทำ
# แสดงข้อมูล
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t -----\t----\t -----" สำหรับฉันใน {0..11} ; ทำ
j=$((ผม + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} เสร็จแล้ว
printf "\nไฟล์ทั้งหมด = %d\n" $count
# ตรวจสอบว่าอาร์กิวเมนต์เป็นไดเร็กทอรีถ้า [[ ! -d $1 ]]; แล้ว
การใช้งาน ทางออก1
fi
# เริ่มต้นอาร์เรย์
สำหรับฉันใน {0..23}; ทำชั่วโมง[i]=0; เสร็จแล้ว
# เก็บข้อมูล
สำหรับฉันใน $(stat -c %y "$1"/* | cut -c 12-13); ทำ j=${i/#0}
((++ชั่วโมง[j])) ((++นับ))
ทำ
# แสดงข้อมูล
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t -----\t----\t -----" สำหรับฉันใน {0..11} ; ทำ
j=$((ผม + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} เสร็จแล้ว
printf "\nไฟล์ทั้งหมด = %d\n" $count
สคริปต์ประกอบด้วยหนึ่งฟังก์ชัน (การใช้) และตัวหลักที่มีสี่ส่วน ในส่วนแรก เราจะตรวจสอบว่ามีอาร์กิวเมนต์บรรทัดรับคำสั่งและเป็นไดเร็กทอรีหรือไม่ หากไม่เป็นเช่นนั้น เราจะแสดงข้อความการใช้งานและออก
ส่วนที่สองเริ่มต้นอาร์เรย์ ชั่วโมง. ทำได้โดยกำหนดค่าแต่ละองค์ประกอบให้เป็นศูนย์ ไม่มีข้อกำหนดพิเศษในการเตรียมอาร์เรย์ก่อนใช้งาน แต่สคริปต์ของเราจำเป็นต้องตรวจสอบให้แน่ใจว่าไม่มีองค์ประกอบใดว่างเปล่า สังเกตวิธีสร้างลูปที่น่าสนใจ โดยใช้เหล็กค้ำยัน ({0...23}) เราสามารถสร้างลำดับของคำได้อย่างง่ายดายสำหรับ for คำสั่ง
ส่วนถัดไปรวบรวมข้อมูลโดยการเรียกใช้ stat โปรแกรมในแต่ละไฟล์ในไดเร็กทอรี เราใช้ ตัด เพื่อแยกชั่วโมงสองหลักออกจากผลลัพธ์ ภายในลูป เราต้องลบเลขศูนย์นำหน้าออกจากช่องชั่วโมง เนื่องจากเชลล์จะพยายาม (และล้มเหลวในท้ายที่สุด) ในการตีความค่า "00" ถึง "09" เป็นตัวเลขฐานแปด (ดูตารางที่ 34-2) ต่อไป เราเพิ่มค่าขององค์ประกอบอาร์เรย์ที่สอดคล้องกับชั่วโมงของวัน สุดท้าย เราเพิ่มตัวนับ (นับ) เพื่อติดตามจำนวนไฟล์ทั้งหมดในไดเร็กทอรี
ส่วนสุดท้ายของสคริปต์จะแสดงเนื้อหาของอาร์เรย์ ขั้นแรก เราส่งออกบรรทัดส่วนหัวสองสามบรรทัด จากนั้นจึงป้อนลูปที่สร้างเอาต์พุตสี่คอลัมน์ สุดท้ายนี้ เราส่งออกจำนวนไฟล์สุดท้าย