<ก่อนหน้านี้ | Contents | ถัดไป>
การมอบหมาย
แม้ว่าการใช้งานอาจไม่ปรากฏให้เห็นในทันที แต่นิพจน์ทางคณิตศาสตร์อาจทำหน้าที่มอบหมาย เราได้ดำเนินการมอบหมายหลายครั้ง แม้ว่าจะอยู่ในบริบทที่แตกต่างกัน ทุกครั้งที่เราให้ค่าตัวแปร เรากำลังดำเนินการมอบหมาย เรายังสามารถทำได้ภายในนิพจน์เลขคณิต:
[me@linuxbox ~]$ ฟู=
[me@linuxbox ~]$ เสียงสะท้อน $foo
[me@linuxbox ~]$ ถ้า (( foo = 5 )); แล้วก้อสะท้อนว่า "จริงอยู่" ; fi
มันเป็นความจริง
[me@linuxbox ~]$ เสียงสะท้อน $foo
5
[me@linuxbox ~]$ ฟู=
[me@linuxbox ~]$ เสียงสะท้อน $foo
[me@linuxbox ~]$ ถ้า (( foo = 5 )); แล้วก้อสะท้อนว่า "จริงอยู่" ; fi
มันเป็นความจริง
[me@linuxbox ~]$ เสียงสะท้อน $foo
5
ในตัวอย่างข้างต้น ก่อนอื่นเรากำหนดค่าว่างให้กับตัวแปร foo และตรวจสอบว่าว่างจริง ต่อไป เราดำเนินการ an if ด้วยคำสั่งประสม (( ฟู = 5
)). กระบวนการนี้ทำสองสิ่งที่น่าสนใจ: 1) กำหนดค่า 5 ให้กับตัวแปร
foo และ 2) ประเมินว่าเป็นจริงเนื่องจาก foo ถูกกำหนดให้เป็นค่าที่ไม่ใช่ศูนย์
หมายเหตุ สิ่งสำคัญคือต้องจำความหมายที่แน่นอนของ = ในนิพจน์ข้างต้น โสด = ดำเนินการมอบหมาย ฟู = 5 บอกว่า “ทำ foo เท่ากับ 5” ในขณะที่ == ประเมินความเท่าเทียมกัน ฟู == 5 พูดว่า “ไม่ foo เท่ากับ 5?” นี่เป็นคุณสมบัติทั่วไปในภาษาการเขียนโปรแกรมหลายภาษา ในเปลือกนี้อาจทำให้สับสนเล็กน้อยเนื่องจาก ทดสอบ คำสั่งยอมรับเดียว = เพื่อความเท่าเทียมกันของสตริง เป็นอีกเหตุผลหนึ่งที่ใช้ความทันสมัยมากขึ้น [[]] และ - คำสั่งประสมแทน ทดสอบ.
นอกจากนี้ยังมี =, เชลล์ยังมีสัญกรณ์ที่ทำหน้าที่บางอย่างที่เป็นประโยชน์มาก:
ตารางที่ 34-4: ผู้ดำเนินการมอบหมาย
คำอธิบายสัญกรณ์
คำอธิบายสัญกรณ์
พารามิเตอร์ = ความคุ้มค่า งานง่ายๆ. มอบหมาย ความคุ้มค่า ไปยัง พารามิเตอร์.
พารามิเตอร์ += ความคุ้มค่า ส่วนที่เพิ่มเข้าไป. เทียบเท่ากับ พารามิเตอร์ = พารามิเตอร์ +
มูลค่า
พารามิเตอร์ -= ความคุ้มค่า การลบ เทียบเท่ากับ พารามิเตอร์ = พารามิเตอร์ -
มูลค่า
พารามิเตอร์ *= ความคุ้มค่า การคูณ เทียบเท่ากับ พารามิเตอร์ = พารามิเตอร์
* มูลค่า
พารามิเตอร์ /= ความคุ้มค่า การหารจำนวนเต็ม เทียบเท่ากับ พารามิเตอร์ =
พารามิเตอร์ / ค่า
พารามิเตอร์ %= ความคุ้มค่า โมดูโล่ เทียบเท่ากับ พารามิเตอร์ = พารามิเตอร์ %
มูลค่า
พารามิเตอร์++ ตัวแปรหลังการเพิ่ม เทียบเท่ากับ พารามิเตอร์ =
พารามิเตอร์ + 1 (อย่างไรก็ตาม ดูการสนทนาด้านล่าง)
พารามิเตอร์−− ตัวแปรหลังการลด เทียบเท่ากับ พารามิเตอร์ =
พารามิเตอร์ - 1
++พารามิเตอร์ ตัวแปรล่วงหน้าที่เพิ่มขึ้น เทียบเท่ากับ พารามิเตอร์ =
พารามิเตอร์ + 1
--พารามิเตอร์ ตัวแปรก่อนการลด เทียบเท่ากับ พารามิเตอร์ =
พารามิเตอร์ - 1
ตัวดำเนินการมอบหมายเหล่านี้ให้ชวเลขที่สะดวกสำหรับงานเลขคณิตทั่วไปจำนวนมาก ที่น่าสนใจเป็นพิเศษคือการเพิ่มขึ้น (++) และลดลง (−−) ตัวดำเนินการ ซึ่งเพิ่มหรือลดค่าของพารามิเตอร์ทีละหนึ่ง รูปแบบของสัญกรณ์นี้นำมาจากภาษาการเขียนโปรแกรม C และรวมเข้ากับภาษาโปรแกรมอื่น ๆ อีกจำนวนหนึ่ง ได้แก่ ทุบตี.
ตัวดำเนินการอาจปรากฏที่ด้านหน้าของพารามิเตอร์หรือที่ส่วนท้าย แม้ว่าทั้งคู่จะเพิ่มหรือลดพารามิเตอร์ทีละหนึ่ง ตำแหน่งทั้งสองก็มีความแตกต่างกันเล็กน้อย หากวางไว้ที่ด้านหน้าของพารามิเตอร์ พารามิเตอร์จะเพิ่มขึ้น (หรือลดลง) ก่อนที่พารามิเตอร์จะถูกส่งคืน หากวางไว้หลัง การดำเนินการจะดำเนินการ หลังจาก พารามิเตอร์จะถูกส่งกลับ สิ่งนี้ค่อนข้างแปลก แต่เป็นพฤติกรรมที่ตั้งใจไว้ นี่คือการสาธิต:
[me@linuxbox ~]$ ฟู=1 [me@linuxbox ~]$ เสียงสะท้อน $((foo++)) 1
[me@linuxbox ~]$ เสียงสะท้อน $foo
[me@linuxbox ~]$ ฟู=1 [me@linuxbox ~]$ เสียงสะท้อน $((foo++)) 1
[me@linuxbox ~]$ เสียงสะท้อน $foo
2
2
ถ้าเรากำหนดค่าหนึ่งให้กับตัวแปร foo แล้วเพิ่มขึ้นด้วย ++ ตัวดำเนินการวางไว้หลังชื่อพารามิเตอร์ foo จะถูกส่งกลับด้วยค่าหนึ่ง อย่างไรก็ตาม หากเราดูค่าของตัวแปรเป็นครั้งที่สอง เราจะเห็นค่าที่เพิ่มขึ้น ถ้าเราวาง ++ โอเปอเรเตอร์หน้าพารามิเตอร์ เราจะได้พฤติกรรมที่คาดหวังมากขึ้น:
[me@linuxbox ~]$ ฟู=1 [me@linuxbox ~]$ เสียงสะท้อน $((++foo)) 2
[me@linuxbox ~]$ เสียงสะท้อน $foo
2
[me@linuxbox ~]$ ฟู=1 [me@linuxbox ~]$ เสียงสะท้อน $((++foo)) 2
[me@linuxbox ~]$ เสียงสะท้อน $foo
2
สำหรับแอปพลิเคชันเชลล์ส่วนใหญ่ การขึ้นต้นตัวดำเนินการจะเป็นประโยชน์มากที่สุด
ตัวดำเนินการ ++ และ -- มักใช้ร่วมกับลูป เราจะทำการปรับปรุงแก้ไขสคริปต์โมดูลของเราเพื่อให้กระชับขึ้นเล็กน้อย:
#! / bin / ทุบตี
# modulo2: สาธิตตัวดำเนินการโมดูโลสำหรับ ((i = 0; i <= 20; ++ฉัน )); ทำ
ถ้า (((ผม % 5) == 0 )); จากนั้น printf "<%d> " $i
อื่น
printf "%d " $i
เสร็จแล้ว
printf "\ n"
#! / bin / ทุบตี
# modulo2: สาธิตตัวดำเนินการโมดูโลสำหรับ ((i = 0; i <= 20; ++ฉัน )); ทำ
ถ้า (((ผม % 5) == 0 )); จากนั้น printf "<%d> " $i
อื่น
printf "%d " $i
เสร็จแล้ว
printf "\ n"