คำสั่งที่เกี่ยวข้องกับเลขคณิตคู่, Dash, POSIX เชลล์, sh, Increment


17

เมื่อก่อน / หลังการเพิ่มตัวแปรใน POSIX Shell ความแตกต่างระหว่างสองตัวอย่างนี้คืออะไร พวกเขาดูเหมือนว่าพวกเขาจะมีผลที่เหมือนกัน แต่พวกเขาจะใช้แตกต่างกันอย่างไร เมื่อไหร่ที่คุณจะชอบอีกอันหนึ่ง?

X=$((X+1))

: $((X=X+1))

คำตอบ:


18

ในตัวอย่างแรกของคุณ$((X+1))ประเมินค่านิพจน์ X + 1 และขยายไปสู่ผลลัพธ์ซึ่งจะถูกกำหนดให้กับตัวแปร

ในตัวอย่างที่สอง$((X=X+1))เพิ่มขึ้นXโดยหนึ่ง ( $((X++))ยังเป็นที่ถูกต้องและสั้น แต่ไม่ได้รับการสนับสนุนโดยจำเป็นต้องเปลือก) จากนั้นจะขยายมูลค่าใหม่ซึ่งเป็นคนแรกที่จะโต้แย้งคำสั่งโมฆะ,$X :คำสั่ง null ละเว้นการขัดแย้งและผลลัพธ์จะถูกทิ้ง (พร้อมกับผลข้างเคียง)

ฉันเองชอบแบบฟอร์มแรกเนื่องจากเหตุผลสามประการ (ค่อนข้างเป็นส่วนตัว):

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

คุณต้องใช้เวอร์ชันแรกหากคุณแก้ไขสภาพแวดล้อมของคำสั่งเดียวเช่น

X=$((X+1)) /usr/local/bin/something

คุณจะต้องใช้แบบฟอร์มที่สองเพื่อเพิ่มการประเมินผลการขัดแย้งโดยตรง:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

นี่คือผลข้างเคียงที่ต้องการบันทึกหนึ่งบรรทัดและค่อนข้างชัดเจน

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