ทั้งหมดเกี่ยวกับคำสั่ง Linux/Unix: expr

NS ด่วน ยูทิลิตี้สำหรับ ลินุกซ์ เชลล์เชื่อมอาร์กิวเมนต์เข้าด้วยกัน จากนั้นจึงประเมินผลลัพธ์เป็นนิพจน์ Tcl โดยคืนค่าเป็นเอาต์พุตมาตรฐาน

ตัวดำเนินการที่อนุญาตในนิพจน์ Tcl เป็นเซตย่อยของตัวดำเนินการที่อนุญาตในนิพจน์ C และมีความหมายและลำดับความสำคัญเดียวกันกับตัวดำเนินการ C ที่เกี่ยวข้อง สำนวนเกือบตลอดเวลา ให้ผลลัพธ์เป็นตัวเลข (ค่าจำนวนเต็มหรือค่าทศนิยม)

ผู้ชายกำลังพิมพ์บนแป้นพิมพ์
รูปภาพ dm909 / Moment / Getty

เรื่องย่อ

คำสั่งใช้รูปแบบทั่วไปต่อไปนี้:

ด่วน arg1 arg2 ...

ตัวถูกดำเนินการ

นิพจน์ Tcl ประกอบด้วยการรวมกันของตัวถูกดำเนินการ ตัวดำเนินการ และวงเล็บ อาจใช้ช่องว่างระหว่างตัวถูกดำเนินการและตัวดำเนินการและวงเล็บ มันจะถูกละเว้นโดยคำแนะนำของนิพจน์

หากเป็นไปได้ ตัวถูกดำเนินการจะถูกตีความว่าเป็นค่าจำนวนเต็ม ค่าจำนวนเต็มอาจระบุเป็นทศนิยม (กรณีปกติ) เป็นฐานแปด (หากอักขระตัวแรกของตัวถูกดำเนินการคือ 0) หรือเลขฐานสิบหก (ถ้าอักขระสองตัวแรกของตัวถูกดำเนินการคือ 0x). หากตัวถูกดำเนินการไม่มีรูปแบบจำนวนเต็มแบบใดแบบหนึ่งที่ระบุข้างต้น จะถือว่าเป็นจำนวนจุดทศนิยมหากเป็นไปได้

อาจมีการระบุตัวเลขทศนิยมด้วยวิธีใดๆ ที่คอมไพเลอร์ C ที่สอดคล้องกับ ANSI ยอมรับ (ยกเว้นว่า 

NS, NS, l, และ หลี่ ส่วนต่อท้ายจะไม่ได้รับอนุญาตในการติดตั้งส่วนใหญ่) ตัวอย่างเช่น ทั้งหมดต่อไปนี้เป็นตัวเลขทศนิยมที่ถูกต้อง: 2.1, 3., 6e4, 7.91e+16. หากไม่สามารถตีความตัวเลขได้ ตัวถูกดำเนินการจะถูกปล่อยให้เป็นสตริงและมีเพียงชุดตัวดำเนินการที่จำกัดเท่านั้นที่จะนำไปใช้กับตัวถูกดำเนินการได้

ตัวถูกดำเนินการอาจถูกระบุด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้:

  • เป็นค่าตัวเลข ไม่ว่าจะเป็นจำนวนเต็มหรือทศนิยม
  • เป็นตัวแปร Tcl โดยใช้ standard $ สัญกรณ์ ค่าของตัวแปรจะถูกใช้เป็นตัวถูกดำเนินการ
  • เป็นสตริงที่อยู่ในเครื่องหมายคำพูดคู่ parser นิพจน์จะทำแบ็กสแลช ตัวแปร และคำสั่งแทนที่ข้อมูลระหว่างเครื่องหมายคำพูด และใช้ค่าผลลัพธ์เป็นตัวถูกดำเนินการ
  • เป็นสตริงที่ล้อมรอบในวงเล็บ อักขระระหว่างวงเล็บปีกกาเปิดและวงเล็บปีกกาที่ตรงกันจะใช้เป็นตัวถูกดำเนินการโดยไม่มีการแทนที่ใดๆ
  • ตามคำสั่ง Tcl ที่อยู่ในวงเล็บ คำสั่งจะถูกดำเนินการและผลลัพธ์จะถูกใช้เป็นตัวถูกดำเนินการ
  • เป็นฟังก์ชันทางคณิตศาสตร์ที่อาร์กิวเมนต์มีรูปแบบข้างต้นสำหรับตัวถูกดำเนินการ เช่น บาป($x).

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

สำหรับตัวอย่างนิพจน์ทั่วไป สมมติว่าตัวแปร NS มีค่า 3 และตัวแปร NS มีค่า 6 จากนั้นคำสั่งทางด้านซ้ายของแต่ละบรรทัดด้านล่างจะสร้างค่าทางด้านขวาของบรรทัด:

ประสบการณ์ 3.1 + $a6.1
ประสบการณ์ 2 + "$a.$b"5.6
expr 4*[llength "6 2"]8
expr {{word one} < "word $a"}0

ผู้ประกอบการ

ตัวดำเนินการที่ถูกต้องแสดงอยู่ด้านล่าง โดยจัดกลุ่มตามลำดับความสำคัญที่ลดลง:

  • - + ~ !: Unary ลบ, unary plus, บิตไม่ฉลาด, ไม่ใช่ตรรกะ ไม่สามารถใช้ตัวถูกดำเนินการเหล่านี้กับตัวถูกดำเนินการสตริง และระดับบิต NOT อาจใช้กับจำนวนเต็มเท่านั้น
  • * / %: คูณหารเศษ ตัวถูกดำเนินการเหล่านี้ไม่สามารถใช้กับตัวถูกดำเนินการสตริง และส่วนที่เหลืออาจใช้กับจำนวนเต็มเท่านั้น เศษที่เหลือจะมีเครื่องหมายเดียวกับตัวหารเสมอ และค่าสัมบูรณ์น้อยกว่าตัวหาร
  • + -: บวกและลบ ใช้ได้กับตัวถูกดำเนินการที่เป็นตัวเลขใดๆ
  • << >>: กะซ้ายและขวา ใช้ได้สำหรับตัวถูกดำเนินการจำนวนเต็มเท่านั้น การเลื่อนไปทางขวาจะกระจายสัญญาณบิตเสมอ
  • < > <= >=: บูลีนน้อยกว่า มากกว่า น้อยกว่าหรือเท่ากับ และมากกว่าหรือเท่ากับ โอเปอเรเตอร์แต่ละตัวสร้าง 1 ถ้าเงื่อนไขเป็นจริง มิฉะนั้น 0 ตัวดำเนินการเหล่านี้อาจใช้กับสตริงเช่นเดียวกับตัวถูกดำเนินการที่เป็นตัวเลข ซึ่งในกรณีนี้จะใช้การเปรียบเทียบสตริง
  • == !=: บูลีนเท่ากับและไม่เท่ากัน โอเปอเรเตอร์แต่ละรายให้ผลลัพธ์เป็นศูนย์/หนึ่ง ใช้ได้กับตัวถูกดำเนินการทุกประเภท
  • &: บิตที่ชาญฉลาดและ. ใช้ได้สำหรับตัวถูกดำเนินการจำนวนเต็มเท่านั้น
  • ^: Bit-wise Exclusive OR ใช้ได้สำหรับตัวถูกดำเนินการจำนวนเต็มเท่านั้น
  • |: บิตฉลาด OR ใช้ได้สำหรับตัวถูกดำเนินการจำนวนเต็มเท่านั้น
  • &&: ตรรกะและ. สร้างผลลัพธ์ 1 ถ้าตัวถูกดำเนินการทั้งสองไม่ใช่ศูนย์ มิฉะนั้น 0 ใช้ได้สำหรับตัวถูกดำเนินการบูลีนและตัวเลข (จำนวนเต็มหรือทศนิยม) เท่านั้น
  • ||: ตรรกะหรือ. ให้ผลลัพธ์เป็น 0 ถ้าตัวถูกดำเนินการทั้งคู่เป็นศูนย์ มิฉะนั้น 1 รายการ ใช้ได้สำหรับตัวถูกดำเนินการบูลีนและตัวเลข (จำนวนเต็มหรือทศนิยม) เท่านั้น
  • NS?y:z: If-then-else เช่นเดียวกับใน C. ถ้า NS ประเมินค่าไม่เป็นศูนย์ ผลลัพธ์จะเป็นค่าของ y. มิฉะนั้น ผลลัพธ์จะเป็นค่าของ z. NS NS ตัวถูกดำเนินการต้องมีค่าตัวเลข

ดูคู่มือ C สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับผลลัพธ์ที่เกิดจากผู้ปฏิบัติงานแต่ละคน ทั้งหมด ตัวดำเนินการไบนารี กลุ่มจากซ้ายไปขวาภายในระดับความสำคัญเดียวกัน ตัวอย่างเช่น คำสั่ง

ประสบการณ์ 4*2 < 7

คืนค่า 0

NS &&, ||, และ ?: โอเปอเรเตอร์มี ``การประเมินแบบขี้เกียจ'' เช่นเดียวกับในภาษาซี ซึ่งหมายความว่าตัวถูกดำเนินการจะไม่ถูกประเมินหากไม่จำเป็นต้องใช้เพื่อกำหนดผลลัพธ์ ตัวอย่างเช่น ใน สั่งการ

ประสบการณ์ {$v? [a]: [b]}

เพียงหนึ่งใน [NS] หรือ [NS] จะถูกประเมินตามมูลค่าของ $v. อย่างไรก็ตาม โปรดทราบว่านี่จะเป็นจริงก็ต่อเมื่อนิพจน์ทั้งหมดอยู่ในวงเล็บปีกกา มิฉะนั้น parser ของ Tcl จะประเมินทั้งสองอย่าง [NS] และ [NS] ก่อนเรียกใช้ ด่วน สั่งการ.

ฟังก์ชันคณิตศาสตร์

Tcl รองรับฟังก์ชันทางคณิตศาสตร์ต่อไปนี้ในนิพจน์:

  • หน้าท้อง (arg): ส่งคืนค่าสัมบูรณ์ของ arg. Arg อาจเป็นจำนวนเต็มหรือทศนิยม และผลลัพธ์จะถูกส่งกลับในรูปแบบเดียวกัน
  • เอคอส(arg): ส่งกลับค่าโคไซน์อาร์คของ arg, ในช่วง [0,pi] เรเดียน Arg ควรอยู่ในช่วง [-1,1]
  • อาซิน(arg): ส่งคืนค่าอาร์คไซน์ของ arg, ในช่วง [-pi/2,pi/2] เรเดียน Arg ควรอยู่ในช่วง [-1,1]
  • เอตัน(arg): ส่งกลับค่าแทนเจนต์ส่วนโค้งของ arg, ในช่วง [-pi/2,pi/2] เรเดียน
  • atan2(x, y): ส่งกลับค่าแทนเจนต์ส่วนโค้งของ y/NS, ในช่วง [-pi, pi] เรเดียน. NS และ y ไม่สามารถทั้งคู่เป็น 0
  • เพดาน (arg): ส่งคืนค่าจำนวนเต็มที่น้อยที่สุดไม่น้อยกว่า arg.
  • เพราะ(arg): ส่งกลับค่าโคไซน์ของ arg, วัดเป็นเรเดียน.
  • cosh(arg): ส่งกลับไฮเปอร์โบลิกโคไซน์ของ arg. ถ้าผลลัพธ์จะทำให้เกิดโอเวอร์โฟลว์ ข้อผิดพลาดจะถูกส่งคืน
  • สองเท่า(arg): ถ้า arg เป็นค่าลอยตัวผลตอบแทน argมิฉะนั้นแปลง arg ลอยตัวและส่งกลับค่าที่แปลงแล้ว
  • ประสบการณ์(arg): ส่งกลับเลขชี้กำลังของ argกำหนดเป็น e**arg. ถ้าผลลัพธ์จะทำให้เกิดโอเวอร์โฟลว์ ข้อผิดพลาดจะถูกส่งคืน
  • พื้น(arg): ส่งคืนค่าอินทิกรัลที่ใหญ่ที่สุดไม่เกิน arg.
  • fmod(x, y): ส่งกลับค่าทศนิยมที่เหลือของการหารของ NS โดย y. ถ้า y คือ 0 ข้อผิดพลาดถูกส่งกลับ
  • จุด (x, y): คำนวณความยาวของด้านตรงข้ามมุมฉากของสามเหลี่ยมมุมฉาก (NS*NS+y*y).
  • int(arg): ถ้า arg เป็นค่าจำนวนเต็ม คืนค่า argมิฉะนั้นแปลง arg เป็นจำนวนเต็มโดยการตัดทอนและส่งกลับค่าที่แปลงแล้ว
  • บันทึก(arg): ส่งกลับค่าลอการิทึมธรรมชาติของ arg. Arg ต้องเป็นค่าบวก
  • บันทึก10(arg): ส่งกลับค่าลอการิทึมฐาน 10 ของ arg. Arg ต้องเป็นค่าบวก
  • ธาร(x, y): คำนวณค่าของ NS ขึ้นสู่อำนาจ y. ถ้า NS เป็นลบ y ต้องเป็นค่าจำนวนเต็ม
  • แรนด์(): ส่งกลับจำนวนทศนิยมจากศูนย์เหลือเพียงน้อยกว่าหนึ่งหรือในเชิงคณิตศาสตร์คือช่วง [0,1) เมล็ดมาจากนาฬิกาภายในของเครื่องหรืออาจตั้งค่าแบบแมนนวลด้วยฟังก์ชัน srand
  • กลม(arg): ถ้า arg เป็นค่าจำนวนเต็ม คืนค่า argมิฉะนั้นแปลง arg เป็นจำนวนเต็มโดยการปัดเศษและส่งกลับค่าที่แปลงแล้ว
  • บาป(arg): ส่งกลับค่าไซน์ของ arg, วัดเป็นเรเดียน.
  • ซินห์(arg): ส่งกลับค่าไฮเปอร์โบลิกไซน์ของ arg. ถ้าผลลัพธ์จะทำให้เกิดโอเวอร์โฟลว์ ข้อผิดพลาดจะถูกส่งคืน
  • sqrt(arg): ส่งกลับรากที่สองของ arg. Arg จะต้องไม่เป็นค่าลบ
  • สแรนด์(arg): NS argซึ่งต้องเป็นจำนวนเต็ม ใช้เพื่อรีเซ็ตเมล็ดพันธุ์สำหรับเครื่องกำเนิดตัวเลขสุ่ม ส่งกลับตัวเลขสุ่มตัวแรกจากเมล็ดนั้น ล่ามแต่ละคนมีเมล็ดพันธุ์ของตัวเอง
  • ผิวสีแทน(arg): ส่งกลับแทนเจนต์ของ arg, วัดเป็นเรเดียน.
  • แทน (arg): ส่งกลับไฮเปอร์โบลิกแทนเจนต์ของ arg.

นอกเหนือจากฟังก์ชันที่กำหนดไว้ล่วงหน้าเหล่านี้ แอปพลิเคชันอาจกำหนดฟังก์ชันเพิ่มเติมโดยใช้ Tcl_CreateMathFunc().

ประเภท โอเวอร์โฟลว์ และความแม่นยำ

การคำนวณภายในทั้งหมดที่เกี่ยวข้องกับจำนวนเต็มทำได้ด้วยประเภท C ยาวและการคำนวณภายในทั้งหมดที่เกี่ยวข้องกับจุดลอยตัวจะทำด้วยประเภท C สองเท่า. เมื่อแปลงสตริงเป็นทศนิยม ตรวจพบการล้นของเลขชี้กำลังและส่งผลให้เกิดข้อผิดพลาด Tcl สำหรับการแปลงเป็นจำนวนเต็มจากสตริง การตรวจหาโอเวอร์โฟลว์ขึ้นอยู่กับพฤติกรรมของรูทีนบางรายการในไลบรารี C ในพื้นที่ ดังนั้นควรถือว่าไม่น่าเชื่อถือ ไม่ว่าในกรณีใด โดยทั่วไปจะตรวจไม่พบจำนวนเต็มมากเกินไปและน้อยเกินไปสำหรับผลลัพธ์ระดับกลาง โอเวอร์โฟลว์จุดลอยตัวและอันเดอร์โฟลว์ถูกตรวจพบในระดับที่ฮาร์ดแวร์รองรับ ซึ่งโดยทั่วไปแล้วค่อนข้างน่าเชื่อถือ

การแปลงระหว่างการแสดงแทนภายในสำหรับตัวถูกดำเนินการจำนวนเต็ม ทศนิยม และสตริงจะทำโดยอัตโนมัติตามความจำเป็น สำหรับการคำนวณทางคณิตศาสตร์ จะใช้จำนวนเต็มจนกว่าจะมีการแนะนำจำนวนจุดทศนิยม หลังจากนั้นจึงใช้จุดทศนิยม ตัวอย่างเช่น,

ประสบการณ์ 5 / 4

คืนค่า 1 ในขณะที่

ประสบการณ์ 5 / 4.0
expr 5 / ( [ความยาวสตริง "abcd"] + 0.0 )

ทั้งคู่กลับมา 1.25 ค่าทศนิยมจะถูกส่งกลับด้วย ``. เสมอ.'' หรือ an อี เพื่อไม่ให้ดูเหมือนค่าจำนวนเต็ม ตัวอย่างเช่น,

ประสบการณ์ 20.0/5.0

ผลตอบแทน 4.0, ไม่ 4.

การดำเนินการสตริง

ค่าสตริงอาจใช้เป็นตัวถูกดำเนินการของตัวดำเนินการเปรียบเทียบ แม้ว่าตัวประเมินนิพจน์จะพยายามเปรียบเทียบเป็นจำนวนเต็มหรือจุดลอยตัวเมื่อทำได้ หากตัวถูกดำเนินการเปรียบเทียบตัวใดตัวหนึ่งเป็นสตริง และอีกตัวหนึ่งมีค่าตัวเลข ตัวถูกดำเนินการที่เป็นตัวเลขจะถูกแปลงกลับเป็นสตริงโดยใช้ C sprintf ตัวระบุรูปแบบ %NS สำหรับจำนวนเต็มและ %NS สำหรับค่าทศนิยม ตัวอย่างเช่น คำสั่ง:

expr {"0x03" > "2"}
ประสบการณ์ {"0y" < "0x12"}

ทั้งสองกลับ 1 การเปรียบเทียบครั้งแรกทำได้โดยใช้การเปรียบเทียบจำนวนเต็ม และการเปรียบเทียบแบบที่สองทำได้โดยใช้การเปรียบเทียบสตริงหลังจากที่ตัวถูกดำเนินการที่สองถูกแปลงเป็นสตริง 18. เนื่องจากแนวโน้มของ Tcl ที่จะปฏิบัติต่อค่าต่างๆ เป็นตัวเลขเมื่อทำได้ โดยทั่วไปไม่ควรใช้โอเปอเรเตอร์เช่น == เมื่อคุณต้องการเปรียบเทียบสตริงจริง ๆ และค่าของตัวถูกดำเนินการอาจเป็นอะไรก็ได้ จะดีกว่าในกรณีเหล่านี้ที่จะใช้ สตริง คำสั่งแทน