ช่องว่างในการกำหนดตัวแปรในเชลล์สคริปต์


17

ความแตกต่างระหว่างการกำหนดตัวแปรด้านล่างคืออะไร?

var=23
var =23
var= 23
var = 23

มีพื้นที่ว่างรอบตัวดำเนินการกำหนดหรือไม่


ในภาษาการเขียนโปรแกรมส่วนใหญ่สิ่งนี้จะสร้างความแตกต่างไม่ได้เลย ... นอกจากนี้คุณกำลังพูดถึง oldschool sh ที่นี่ ไม่เถ้า / zsh / bash หรือสิ่งใหม่อื่น ๆ ?
เซสตาเรียน

เฉพาะตัวอย่างแรกเท่านั้นที่ตั้งค่าตัวแปร
DisplayName

ถ้าอย่างนั้นไม่ใช่ 3 ข้อสุดท้ายที่จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ใช่หรือไม่ หรือพวกเขามีความหมายจริง ๆ ?
เซสตาเรียน

2
@Cestarian พวกเขาอาจจะหมายถึงบางสิ่งบางอย่างถ้าคุณมีคำสั่งที่เรียกว่าvarแล้วvar =23จะผ่าน=23ไป var และvar = 23จะผ่าน=และ23จะ var หรือถ้าคุณมีคำสั่งที่เรียกว่าvar=แล้วvar= 23จะผ่านคำสั่ง23 var=
DisplayName

1
@Castarian แทนที่โดยbashซึ่งทำสิ่งเดียวกันเหมือนกับshในทั้งสี่กรณี
pfnuesel

คำตอบ:


14

มันขึ้นอยู่กับเปลือกหอยเป็นอย่างมาก ถ้าเราดูเฉพาะ 4 เชลล์หลักตระกูล (Bourne, csh, rc, fish):

ครอบครัวบอร์น

นั่นคือเปลือกบอร์นและตัวแปรทั้งหมดและksh, bash, ash/ dash, ,zshyash

  • var=23: นั่นคือไวยากรณ์การกำหนดตัวแปรที่ถูกต้อง: คำที่ประกอบด้วยตัวอักษรที่ไม่มีเครื่องหมายอัญประกาศตัวเลขหรือขีดล่างตามด้วยเครื่องหมายอัญประกาศ=ที่ไม่ปรากฏที่ปรากฏก่อนอาร์กิวเมนต์คำสั่ง (นี่คือตัวของมันเอง)
  • var =23ที่varคำสั่งกับ=23เป็นอาร์กิวเมนต์ (ยกเว้นในzshที่=somethingเป็นผู้ประกอบการพิเศษที่จะขยายไปยังเส้นทางของsomethingคำสั่ง. ที่นี่คุณจะมีแนวโน้มที่จะได้รับข้อผิดพลาดในขณะที่23ไม่น่าจะเป็นชื่อคำสั่งที่ถูกต้อง)
  • var= 23: ได้รับมอบหมายตามด้วยชื่อคำสั่งvar= 23นั่นหมายถึงการดำเนินการ23โดยvar=ส่งผ่านไปยังสภาพแวดล้อม ( varตัวแปรสภาพแวดล้อมที่มีค่าว่าง)
  • var = 23, varสั่งอาหารด้วย=และ23เป็นอาร์กิวเมนต์ ลองด้วยecho = 23เช่น

ครอบครัว Csh

cshtcshและ การกำหนดตัวแปรที่มีกับset var = valueไวยากรณ์สำหรับตัวแปรสเกลาร์set var = (a b)สำหรับอาร์เรย์setenv var valueสำหรับตัวแปรสภาพแวดล้อม@ var=1+1สำหรับการกำหนดและการประเมินผลทางคณิตศาสตร์

ดังนั้น:

  • var=23เป็นเพียงการเรียกใช้var=23คำสั่ง
  • var =23กำลังเรียกใช้varคำสั่งด้วย=23อาร์กิวเมนต์
  • var= 23กำลังเรียกใช้var=คำสั่งด้วย23อาร์กิวเมนต์
  • var = 23กำลังเรียกใช้varคำสั่งด้วย=และ23เป็นอาร์กิวเมนต์

ครอบครัว Rc

ว่าrc, และes akangaในเชลล์เหล่านั้นตัวแปรคืออาร์เรย์และการกำหนดค่าด้วยvar = (foo bar)โดยvar = fooย่อสำหรับvar = (foo)(อาร์เรย์ที่มีหนึ่งfooองค์ประกอบ) และvar =สั้นสำหรับvar = ()(อาร์เรย์ที่ไม่มีองค์ประกอบให้ใช้var = ''สำหรับอาร์เรย์ที่มีหนึ่งองค์ประกอบที่ว่างเปล่า)

ไม่ว่าในกรณีใดช่องว่าง (เว้นวรรคหรือแท็บ) =จะได้รับอนุญาตและเป็นตัวเลือก ดังนั้นในเปลือกหอยบรรดาผู้ที่ 4 คำสั่งที่เทียบเท่าและเทียบเท่ากับการที่จะกำหนดอาร์เรย์ที่มีองค์ประกอบหนึ่งเป็นvar = (23)23

ปลา

ในไวยากรณ์การกำหนดตัวแปรคือfish set var value1 value2เช่นเดียวกับในrcตัวแปรคืออาร์เรย์

ดังนั้นพฤติกรรมจะเหมือนกันกับcshยกเว้นว่าfishจะไม่ให้คุณเรียกใช้คำสั่งที่มี=ชื่อ หากคุณมีคำสั่งดังกล่าวคุณจะต้องเรียกใช้มันผ่านshตัวอย่างเช่น: sh -c 'exec weird===cmd'.

ดังนั้นทั้งหมดvar=23และvar= 23จะทำให้คุณมีข้อผิดพลาดvar =23จะเรียกvarคำสั่งด้วย=23เป็นอาร์กิวเมนต์และvar = 23จะเรียกvarคำสั่งด้วย=และ23เป็นอาร์กิวเมนต์


8

var=23กำหนด 23 varให้กับตัวแปร

var =23พยายามเรียกใช้คำสั่ง (หรือนามแฝงหรือฟังก์ชัน) varด้วยอาร์กิวเมนต์=23

var = 23เหมือนกัน แต่ข้อโต้แย้ง=และ23

var= 23ตั้งค่าvarตัวแปรสภาพแวดล้อมเป็นสตริงว่างจากนั้นรันคำสั่ง23

ใช่เชลล์เป็นภาษาแปลก ๆ ในการเขียนโปรแกรม แต่มันสมเหตุสมผลอย่างสมบูรณ์ในฐานะเชลล์สำหรับการใช้งานแบบอินเตอร์แอคทีฟซึ่งเว้นวรรคคำสั่งและอาร์กิวเมนต์ "อักขระพิเศษ" ส่วนใหญ่ ( =ในกรณีนี้) มีความหมายพิเศษเฉพาะในตำแหน่งเฉพาะเพื่ออนุญาตให้มีการขัดแย้งโดยพลการกับคำสั่งดูการตีความข้างต้น


3
  • var=23 เป็นไวยากรณ์ที่ถูกต้องสำหรับการกำหนดค่าให้กับตัวแปร
  • var =23ถือเป็นคำสั่งที่varมี=23ตัวเลือก / อาร์กิวเมนต์สำหรับคำสั่งvar(แม้ว่าไวยากรณ์ / มาตรฐานที่ถูกต้องสำหรับอาร์กิวเมนต์ / ตัวเลือกคือ-optionหรือ--option)
  • var= 23จะไม่ทำอะไรเลยvarเมื่อพื้นที่สีขาวแบ่งกระบวนการกำหนดและ23จะถือว่าเป็นคำสั่งอื่น วิธีแก้ปัญหาคือvar=\ 23หรือvar=' 23'สำหรับการจัดเก็บพื้นที่สีขาว
  • var = 23มีผลคล้ายกันตามที่กล่าวไว้ใน 2 ndกรณี

    อันที่จริงการใช้งานประเภทนี้ของพื้นที่รอบ ๆมักจะใช้ในการทดสอบสภาพภายใน= [[ ]]ตัวอย่างสำหรับ Bash:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

และหลังจากทั้งหมดพฤติกรรมของพื้นที่สีขาว=ขึ้นอยู่กับเชลล์และภาษาการเขียนโปรแกรมของคุณ

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