รหัสของคุณควรใช้งานได้ แต่ถ้า$MY_LISTไม่มีอักขระพิเศษต่าง ๆ :
echo $MY_LISTควรจะเป็นหรือprintf %s "$MY_LIST" print -r -- "$MY_LIST"การไม่มีเครื่องหมายอัญประกาศบอกให้เชลล์แสดงตัวอักษรกลมที่มี\\*?[อยู่ นอกจากนี้ยังบอกให้เชลล์แยกคำที่ช่องว่างแม้ว่าจะไม่สำคัญที่นี่ยกเว้นสำหรับปัญหาถัดไป
- การใช้
echoสาเหตุการตีความเพิ่มเติมของแบ็กสแลชและการเป็นผู้นำ-ในบางสถานการณ์
- `sed s" /, / / g "ทำให้ทั้งเครื่องหมายจุลภาคและเว้นวรรคคั่นคำ
ปัญหาเพิ่มเติมอธิบายว่าทำไมการทดสอบขั้นสุดท้ายของคุณไม่ทำงานนั่นคือการwc -wสร้างเอาต์พุตด้วยช่องว่างนำซึ่งถูกบันทึก$NUM_IN_LISTไว้ print $NUM_IN_LISTทำการแยกคำออก$NUM_IN_LISTดังนั้นมันจะจบลงด้วยการพิมพ์ตัวเลข ทำprint "$NUM_IN_LIST"เพื่อดูความแตกต่าง [[ … ]]สร้างยับยั้งการแยกคำและ=เป็นผู้ประกอบการเปรียบเทียบสตริงดังนั้นคุณจะบอกได้อย่างถูกต้องที่ไม่ได้เป็นสิ่งเดียวกับ' 3' หรือจะเป็นจริง (แต่ไม่ใช่วิธีการแก้ปัญหาจริงพวกเขาเป็นเพียงการแก้ปัญหาที่ จำกัด )'3'[[ $NUM_IN_LIST -eq 3 ]][ $NUM_IN_LIST = 3 ]
วิธี ksh ล้วนเพื่อแสดงจำนวนของเขตข้อมูลที่คั่นด้วยเครื่องหมายจุลภาคคือ
commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}
หากใครต้องการโซลูชั่นที่ POSIX commas=$(printf %s "$MY_LIST" | tr -dc ,)ดวลจุดโทษแทนบรรทัดแรกโดย