<ก่อนหน้านี้ | เนื้อหา | ถัดไป>
ตัวแปรและค่าคงที่
อย่างไรก็ตาม สคริปต์ของเรามีปัญหา สังเกตว่าสตริง "System Information Report" ซ้ำกันอย่างไร? ด้วยสคริปต์ขนาดเล็กของเรา มันไม่ใช่ปัญหา แต่ลองนึกดูว่าสคริปต์ของเรายาวจริงๆ และเรามีสตริงนี้หลายอินสแตนซ์ ถ้าเราต้องการเปลี่ยนชื่อเรื่องเป็นอย่างอื่น เราจะต้องเปลี่ยนหลายๆ ตำแหน่งซึ่งอาจเป็นงานที่หนักมาก จะเป็นอย่างไรถ้าเราสามารถจัดเรียงสคริปต์เพื่อให้สตริงปรากฏเพียงครั้งเดียวและไม่ปรากฏหลายครั้ง นั่นจะทำให้การบำรุงรักษาสคริปต์ในอนาคตง่ายขึ้นมาก นี่คือวิธีที่เราทำได้:
#! / bin / ทุบตี
# โปรแกรมออกหน้าข้อมูลระบบ
title="รายงานข้อมูลระบบ"
เสียงสะท้อน "
$ชื่อ
$ชื่อ
"
#! / bin / ทุบตี
# โปรแกรมออกหน้าข้อมูลระบบ
title="รายงานข้อมูลระบบ"
เสียงสะท้อน "
$ชื่อ
$ชื่อ
"
โดยการสร้าง ตัวแปร ชื่อ ชื่อเรื่อง และกำหนดมูลค่า "System Information Report" ให้เราสามารถใช้ประโยชน์จากการขยายพารามิเตอร์และวางสตริงไว้ในหลายตำแหน่ง
แล้วเราจะสร้างตัวแปรได้อย่างไร? ง่ายๆ แค่เราใช้มัน เมื่อเชลล์พบตัวแปร เชลล์จะสร้างมันขึ้นมาโดยอัตโนมัติ ซึ่งแตกต่างจากภาษาโปรแกรมหลายภาษาที่ตัวแปรต้องชัดเจน ประกาศ หรือกำหนดไว้ก่อนใช้งาน เปลือกมีความหละหลวมมากเกี่ยวกับเรื่องนี้ ซึ่งอาจนำไปสู่ปัญหาบางอย่าง ตัวอย่างเช่น ลองพิจารณาสถานการณ์นี้ในบรรทัดคำสั่ง:
[me@linuxbox ~]$ foo="ใช่" [me@linuxbox ~]$ เสียงสะท้อน $foo ใช่
[me@linuxbox ~]$ ก้อง $fool
[me@linuxbox ~]$
[me@linuxbox ~]$ foo="ใช่" [me@linuxbox ~]$ เสียงสะท้อน $foo ใช่
[me@linuxbox ~]$ ก้อง $fool
[me@linuxbox ~]$
ก่อนอื่นเรากำหนดค่า "ใช่" ให้กับตัวแปร fooแล้วแสดงค่าด้วย เสียงสะท้อน. ต่อไปเราแสดงค่าของชื่อตัวแปรที่สะกดผิดว่าเป็น "คนโง่" และรับค่าว่างเปล่าอีกครั้ง ทั้งนี้เป็นเพราะเชลล์สร้างตัวแปรอย่างมีความสุข คนโง่ เมื่อพบมันและให้ค่าเริ่มต้นเป็นไม่มีอะไรหรือว่างเปล่า จากนี้เราเรียนรู้ว่าเราต้องใส่ใจกับการสะกดคำของเรา! สิ่งสำคัญคือต้องเข้าใจสิ่งที่เกิดขึ้นในตัวอย่างนี้ จากการดูก่อนหน้านี้ว่าเชลล์ดำเนินการขยายอย่างไร เรารู้ว่าคำสั่ง:
[me@linuxbox ~]$ echo $foo
[me@linuxbox ~]$ echo $foo
ผ่านการขยายพารามิเตอร์และส่งผลให้:
[me@linuxbox ~]$ ก้องใช่
[me@linuxbox ~]$ ก้องใช่
ในขณะที่คำสั่ง:
[me@linuxbox ~]$ สะท้อน $fool
[me@linuxbox ~]$ สะท้อน $fool
ขยายเป็น:
[me@linuxbox ~]$ เสียงสะท้อน
[me@linuxbox ~]$ เสียงสะท้อน
ตัวแปรว่างขยายเป็นไม่มีอะไร! สิ่งนี้สามารถสร้างความหายนะด้วยคำสั่งที่ต้องใช้อาร์กิวเมนต์ นี่คือตัวอย่าง:
[me@linuxbox ~]$ ฟู=foo.txt [me@linuxbox ~]$ foo1=foo1.txt [me@linuxbox ~]$ ซีพี $foo $fool
cp: ไม่มีตัวถูกดำเนินการของไฟล์ปลายทางหลังจาก `foo.txt'
[me@linuxbox ~]$ ฟู=foo.txt [me@linuxbox ~]$ foo1=foo1.txt [me@linuxbox ~]$ ซีพี $foo $fool
cp: ไม่มีตัวถูกดำเนินการของไฟล์ปลายทางหลังจาก `foo.txt'
ลองใช้ `cp --help' เพื่อดูข้อมูลเพิ่มเติม
ลองใช้ `cp --help' เพื่อดูข้อมูลเพิ่มเติม
เรากำหนดค่าให้กับสองตัวแปร foo และ ฟู1. จากนั้นเราดำเนินการ a cpแต่สะกดชื่ออาร์กิวเมนต์ที่สองผิด หลังจากการขยายตัว cp คำสั่งถูกส่งเพียงหนึ่งอาร์กิวเมนต์ แม้ว่าจะต้องใช้สองอาร์กิวเมนต์
มีกฎเกณฑ์บางประการเกี่ยวกับชื่อตัวแปร:
1. ชื่อตัวแปรอาจประกอบด้วยอักขระที่เป็นตัวอักษรและตัวเลขคละกัน (ตัวอักษรและตัวเลข) และอักขระขีดล่าง
2. อักขระตัวแรกของชื่อตัวแปรต้องเป็นตัวอักษรหรือขีดล่าง
3. ไม่อนุญาตให้เว้นวรรคและเครื่องหมายวรรคตอน
คำว่า "ตัวแปร" หมายถึงค่าที่เปลี่ยนแปลง และในหลาย ๆ แอปพลิเคชัน ตัวแปรจะถูกใช้ในลักษณะนี้ อย่างไรก็ตาม ตัวแปรในแอปพลิเคชันของเรา ชื่อเรื่อง, ใช้เป็น คงที่. ค่าคงที่ก็เหมือนตัวแปรที่มีชื่อและมีค่า ความแตกต่างคือค่าคงที่ไม่เปลี่ยนแปลง ในแอปพลิเคชันที่ทำการคำนวณทางเรขาคณิต เราอาจกำหนด PI เป็นค่าคงที่และกำหนดค่าของ 3.1415แทนที่จะใช้ตัวเลขตามตัวอักษรตลอดโปรแกรมของเรา เชลล์ทำให้ไม่มีความแตกต่างระหว่างตัวแปรและค่าคงที่ ส่วนใหญ่เป็นความสะดวกของโปรแกรมเมอร์ หลักการทั่วไปคือการใช้อักษรตัวพิมพ์ใหญ่เพื่อกำหนดค่าคงที่และตัวพิมพ์เล็กสำหรับตัวแปรจริง เราจะแก้ไขสคริปต์ของเราเพื่อให้เป็นไปตามข้อตกลงนี้:
#! / bin / ทุบตี
# โปรแกรมออกหน้าข้อมูลระบบ TITLE="รายงานข้อมูลระบบ สำหรับ $HOSTNAME"เอคโค่"
$TITLE
$TITLE
"
#! / bin / ทุบตี
# โปรแกรมออกหน้าข้อมูลระบบ TITLE="รายงานข้อมูลระบบ สำหรับ $HOSTNAME"เอคโค่"
$TITLE
$TITLE
"
เรายังใช้โอกาสในการแจ๊สชื่อของเราด้วยการเพิ่มมูลค่าของตัวแปรเชลล์
ชื่อโฮสต์ นี่คือชื่อเครือข่ายของเครื่อง
หมายเหตุ: เชลล์มีวิธีการบังคับใช้ความไม่เปลี่ยนรูปของค่าคงที่ ผ่านการใช้ ประกาศ คำสั่งในตัวด้วย -r (อ่านอย่างเดียว) ตัวเลือก ถ้าเรามอบหมาย TITLE ทางนี้:
ประกาศ -r TITLE="ชื่อหน้า"
เชลล์จะป้องกันไม่ให้มีการมอบหมายให้ TITLE. คุณลักษณะนี้ไม่ค่อยได้ใช้ แต่มีไว้สำหรับสคริปต์ที่เป็นทางการมาก