ทดสอบ POSIX และ -a


9

ฉันตรวจสอบสคริปต์ของฉันด้วยcheckbashismsและฉันได้รับคำเตือนดังต่อไปนี้:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

ในข้อกำหนด 4.62.4 ของ POSIX ที่ฉันพบ

primary -a primary ดำเนินการไบนารีและของผลลัพธ์หลักและหลัก ตัวดำเนินการ -a มีความสำคัญเหนือกว่าตัวดำเนินการ -o

ทำไม-aและ-oไม่ถือว่าเป็นอุปกรณ์พกพา

คำตอบ:


11

มันไม่มากที่มันไม่สามารถพกพาได้ แต่มันไม่มี[การใช้งานที่น่าเชื่อถือเมื่อผ่านการโต้แย้งมากกว่า 4 ครั้ง

แม้ในทุบตี:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

สถานะส่วนที่เกี่ยวข้อง:

> 4 ข้อโต้แย้ง :

ผลลัพธ์ที่ไม่ได้ระบุ

[OB XSI] [ตัวเลือกเริ่ม] บนระบบที่สอดคล้องกับ XSI การรวมกลุ่มของผู้ประกอบการและผู้ประกอบการจะต้องได้รับการประเมินโดยใช้กฎที่มาก่อนและเชื่อมโยงกันที่อธิบายไว้ก่อนหน้านี้ นอกจากนี้สตริงการเปรียบเทียบไบนารี '=' และ "! =" จะต้องมีลำดับความสำคัญสูงกว่าหลักหลักใด ๆ [ตัวเลือกท้าย]

-aและ-oควรถูกแบน วิธีที่ถูกต้องคือใช้ตัวดำเนินการ&&และ|| เชลล์แทน:

if [ -n "$foo" ] && [ -n "$bar" ]; then

ฉันยังพบว่ามันอ่านง่ายขึ้น


ขอบคุณดังนั้นทางออกเดียวที่จะมีการทดสอบสองครั้ง? `ถ้า [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo

3
ไม่ใช่เพียงคนเดียว แต่เป็นสิ่งที่ดีที่สุดและแนะนำให้ใช้แทน-aและ-o
Stéphane Chazelas

โอเคขอบคุณมาก (เพียงฉันหมายความว่าไม่มีทางที่จะมีการทดสอบเดียว ... )
Matteo

1
ใช่คุณสามารถทำ[ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](ยังไม่ระบุตาม POSIX แต่พกพาและเชื่อถือได้) หรือ[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.