อย่าใช้โอเปอเรเตอร์ `-a` หรือ` -o 'กับ `['


11

Stéphane Chazelasเขียนว่า:

กฎบางอย่างเช่น

  • อ้างถึงตัวแปรเสมอ
  • ไม่เคยใช้ตัวดำเนินการ-aหรือ-o(ใช้หลาย[คำสั่งและตัวดำเนินการ&&และ||เชลล์)

สร้าง[ความน่าเชื่อถือด้วย POSIX shells

ทำไม "ไม่เคยใช้-aหรือ-oโอเปอเรเตอร์"

ฉันจะ "ใช้[คำสั่งหลายคำสั่งและตัวดำเนินการ&&และ||เชลล์)" ได้อย่างไร

คำตอบ:


13

ทำไม "ไม่เคยใช้-aหรือ-oโอเปอเรเตอร์"

เพราะพวกมันอาจไม่ได้มาตรฐานและด้วยเหตุนี้พวกเขาจึงไม่ได้มาตรฐาน POSIX :

ส่วนขยาย XSI ที่ระบุตัวดำเนินการไบนารี -a และ -o และตัวดำเนินการ '(' และ ')' ถูกทำเครื่องหมายล้าสมัย (นิพจน์จำนวนมากที่ใช้นิพจน์นั้นถูกกำหนดโดยไวยากรณ์อย่างไม่ชัดเจนขึ้นอยู่กับนิพจน์เฉพาะที่ได้รับการประเมิน) สคริปต์ที่ใช้นิพจน์เหล่านี้ควรถูกแปลงเป็นรูปแบบที่ระบุด้านล่าง แม้ว่าการนำไปใช้งานจำนวนมากจะยังคงสนับสนุนรูปแบบที่ล้าสมัยเหล่านี้ แต่สคริปต์ควรระมัดระวังอย่างยิ่งเมื่อต้องจัดการกับอินพุตที่ผู้ใช้จัดหาซึ่งอาจสับสนกับสิ่งเหล่านี้และพรรคและผู้ประกอบการอื่น ๆ หากผู้พัฒนาแอปพลิเคชั่นรู้ทุกกรณีที่สร้างอินพุตให้กับสคริปต์การเรียกใช้เช่น:

test "$1" -a "$2"

ควรเขียนเป็น:

test "$1" && test "$2"

ฉันจะ "ใช้[คำสั่งหลายคำสั่งและตัวดำเนินการ&&และ||เชลล์)" ได้อย่างไร

โดยทำการทดสอบหลายรายการและผูกมัดพวกเขาโดยใช้ตัวดำเนินการดังกล่าว ตัวอย่างเช่น:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

สามารถเขียนใหม่ได้เทียบเท่า:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

หรือดีกว่า:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

ขอบคุณ (1) "ตัวดำเนินการ" ('และ') 'ถูกทำเครื่องหมายล้าสมัย " เป็น(และ)ผู้ประกอบการที่กลุ่มคำสั่ง? หากพวกเขาล้าสมัยสิ่งทดแทนของพวกเขาคืออะไร? (2) ควรtest "$1" -a "$2"ถูกแทนที่ด้วยtest "$1" && test "$2"หรือโดย((test "$1" && test "$2"))? เราไม่ต้องการ((..))หรือ
ทิม

@Tim ดูการอัปเดต (1) ใช่ - คุณสามารถใช้()และ{}แทน (2) คนแรก; (())ถูกนำมาใช้สำหรับการขยายตัวทางคณิตศาสตร์ที่นี่คุณต้องการที่จะทดสอบออกจากสถานะของห่วงโซ่ของการทดสอบเพื่อให้กลุ่มทั้งการทดสอบใน subshell ที่หรือในเปลือกปัจจุบัน() {}
kos

ขอบคุณ ฉันคิดว่าคำถามของฉันอาจไปไกลกว่าโพสต์นี้ ดังนั้นฉันโพสต์ไว้ในโพสต์ใหม่
ทิม

1
@ Tim เหตุผลเดียวที่จะใช้(และ)ผู้ประกอบการคือเมื่อคุณกำลังใช้หรือ-a -oเนื่องจากสิ่งหลังล้าสมัยอดีตจึงไม่ต้องการอีกต่อไปเช่นกัน
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.