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

เรื่องย่อ
คำสั่งใช้รูปแบบทั่วไปต่อไปนี้:
ด่วน arg1 arg2 ...
ตัวถูกดำเนินการ
นิพจน์ Tcl ประกอบด้วยการรวมกันของตัวถูกดำเนินการ ตัวดำเนินการ และวงเล็บ อาจใช้ช่องว่างระหว่างตัวถูกดำเนินการและตัวดำเนินการและวงเล็บ มันจะถูกละเว้นโดยคำแนะนำของนิพจน์
หากเป็นไปได้ ตัวถูกดำเนินการจะถูกตีความว่าเป็นค่าจำนวนเต็ม ค่าจำนวนเต็มอาจระบุเป็นทศนิยม (กรณีปกติ) เป็นฐานแปด (หากอักขระตัวแรกของตัวถูกดำเนินการคือ 0) หรือเลขฐานสิบหก (ถ้าอักขระสองตัวแรกของตัวถูกดำเนินการคือ 0x). หากตัวถูกดำเนินการไม่มีรูปแบบจำนวนเต็มแบบใดแบบหนึ่งที่ระบุข้างต้น จะถือว่าเป็นจำนวนจุดทศนิยมหากเป็นไปได้
อาจมีการระบุตัวเลขทศนิยมด้วยวิธีใดๆ ที่คอมไพเลอร์ C ที่สอดคล้องกับ ANSI ยอมรับ (ยกเว้นว่า
ตัวถูกดำเนินการอาจถูกระบุด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้:
- เป็นค่าตัวเลข ไม่ว่าจะเป็นจำนวนเต็มหรือทศนิยม
- เป็นตัวแปร 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 ที่จะปฏิบัติต่อค่าต่างๆ เป็นตัวเลขเมื่อทำได้ โดยทั่วไปไม่ควรใช้โอเปอเรเตอร์เช่น == เมื่อคุณต้องการเปรียบเทียบสตริงจริง ๆ และค่าของตัวถูกดำเนินการอาจเป็นอะไรก็ได้ จะดีกว่าในกรณีเหล่านี้ที่จะใช้ สตริง คำสั่งแทน