Unix / Linux - กลไกการอ้างอิงเชลล์

ในบทนี้เราจะพูดถึงรายละเอียดเกี่ยวกับกลไกการเสนอราคาเชลล์ เราจะเริ่มต้นด้วยการพูดคุยเกี่ยวกับ metacharacters

Metacharacters

Unix Shell นำเสนอ metacharacters ต่างๆที่มีความหมายพิเศษในขณะที่ใช้ใน Shell Script ใด ๆ และทำให้เกิดการยุติคำเว้นแต่จะยก

ตัวอย่างเช่น, ? จับคู่กับอักขระเดี่ยวในขณะที่แสดงรายการไฟล์ในไดเร็กทอรีและไฟล์ *จับคู่อักขระมากกว่าหนึ่งตัว นี่คือรายการของอักขระพิเศษเชลล์ส่วนใหญ่ (เรียกอีกอย่างว่าอักขระเมตาคาแร็กเตอร์) -

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

อาจมีการยกตัวอักษร (กล่าวคือสร้างขึ้นเพื่อให้เป็นของตัวเอง) โดยนำหน้าด้วย a \.

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีการพิมพ์ไฟล์ * หรือก ? -

#!/bin/sh

echo Hello; Word

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

Hello
./test.sh: line 2: Word: command not found

shell returned 127

ตอนนี้ให้เราลองใช้อักขระที่ยกมา -

#!/bin/sh

echo Hello\; Word

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

Hello; Word

$ เครื่องหมายเป็นหนึ่งในอักขระเมตาดังนั้นจึงต้องยกมาเพื่อหลีกเลี่ยงการจัดการพิเศษโดยเชลล์ -

#!/bin/sh

echo "I have \$1200"

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

I have $1200

ตารางต่อไปนี้แสดงการเสนอราคาสี่รูปแบบ -

ซีเนียร์ ใบเสนอราคาและคำอธิบาย
1

Single quote

อักขระพิเศษทั้งหมดระหว่างเครื่องหมายคำพูดเหล่านี้จะสูญเสียความหมายพิเศษ

2

Double quote

อักขระพิเศษส่วนใหญ่ระหว่างเครื่องหมายคำพูดเหล่านี้จะสูญเสียความหมายพิเศษด้วยข้อยกเว้นเหล่านี้ -

  • $
  • `
  • \$
  • \'
  • \"
  • \\
3

Backslash

อักขระใด ๆ ที่อยู่ถัดจากแบ็กสแลชทันทีจะสูญเสียความหมายพิเศษไป

4

Back quote

สิ่งใดก็ตามที่อยู่ระหว่างเครื่องหมายคำพูดย้อนกลับจะถือว่าเป็นคำสั่งและจะถูกดำเนินการ

คำคมเดียว

พิจารณาคำสั่ง echo ที่มีอักขระเชลล์พิเศษจำนวนมาก -

echo <-$1500.**>; (update?) [y|n]

การใส่แบ็กสแลชไว้หน้าอักขระพิเศษแต่ละตัวนั้นน่าเบื่อและทำให้อ่านยาก -

echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]

มีวิธีง่ายๆในการอ้างอิงอักขระกลุ่มใหญ่ ใส่เครื่องหมายคำพูดเดี่ยว (') ที่จุดเริ่มต้นและตอนท้ายของสตริง -

echo '<-$1500.**>; (update?) [y|n]'

อักขระที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะถูกยกมาเหมือนกับว่าแบ็กสแลชอยู่ข้างหน้าอักขระแต่ละตัว ด้วยสิ่งนี้คำสั่ง echo จะแสดงในลักษณะที่เหมาะสม

หากเครื่องหมายคำพูดเดียวปรากฏขึ้นภายในสตริงที่จะส่งออกคุณไม่ควรใส่ทั้งสตริงไว้ในเครื่องหมายคำพูดเดียว แต่คุณควรนำหน้าด้วยเครื่องหมายแบ็กสแลช (\) ดังนี้ -

echo 'It\'s Shell Programming

คำคมคู่

พยายามรันเชลล์สคริปต์ต่อไปนี้ เชลล์สคริปต์นี้ใช้ประโยชน์จากเครื่องหมายคำพูดเดียว -

VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]

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

VAR=ZARA
echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

ZARA owes <-$1500.**>; [ as of (07/02) ]

เครื่องหมายคำพูดคู่นำความหมายพิเศษของอักขระทั้งหมดออกไปยกเว้นต่อไปนี้ -

  • $ สำหรับการทดแทนพารามิเตอร์

  • Backquotes สำหรับการทดแทนคำสั่ง

  • \$ เพื่อเปิดใช้งานเครื่องหมายดอลลาร์ตามตัวอักษร

  • \` เพื่อเปิดใช้งาน backquotes ตามตัวอักษร

  • \" เพื่อเปิดใช้งานเครื่องหมายคำพูดคู่แบบฝัง

  • \\ เพื่อเปิดใช้แบ็กสแลชแบบฝัง

  • อื่น ๆ ทั้งหมด \ อักขระเป็นตัวอักษร (ไม่ใช่พิเศษ)

อักขระที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะถูกยกมาเหมือนกับว่าแบ็กสแลชอยู่ข้างหน้าอักขระแต่ละตัว สิ่งนี้ช่วยให้คำสั่ง echo แสดงอย่างถูกต้อง

หากเครื่องหมายคำพูดเดียวปรากฏขึ้นภายในสตริงที่จะส่งออกคุณไม่ควรใส่ทั้งสตริงไว้ในเครื่องหมายคำพูดเดียว แต่คุณควรนำหน้าด้วยเครื่องหมายแบ็กสแลช (\) ดังนี้ -

echo 'It\'s Shell Programming'

Backquotes

การใส่คำสั่ง Shell ใด ๆ ระหว่าง backquotes รันคำสั่ง

ไวยากรณ์

นี่คือไวยากรณ์ง่ายๆในการใส่ Shell command อยู่ระหว่าง backquotes -

var=`command`

ตัวอย่าง

date คำสั่งถูกดำเนินการในตัวอย่างต่อไปนี้และผลลัพธ์ที่ได้จะถูกเก็บไว้ในตัวแปร DATA

DATE=`date`

echo "Current Date: $DATE"

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

Current Date: Thu Jul  2 05:28:45 MST 2009