วงเล็บเดียวในการกำหนดตัวแปร bash


11

ฉันสงสัยเกี่ยวกับวงเล็บเดี่ยวในทุบตี ฉันรู้ว่าพวกเขาจะใช้สำหรับการดำเนินการคำสั่งใน subshells และพวกเขาจะใช้สำหรับการสร้างอาร์เรย์ แต่พวกเขาจะใช้เพื่ออะไรอย่างอื่น?

สิ่งหนึ่งที่ดึงดูดความสนใจของฉันคือเมื่อคุณใช้ในการกำหนดตัวแปรเช่น

var=(hello)
echo $var    # hello

ทุบตีไม่ได้สร้างข้อผิดพลาดหรืออะไรและผลลัพธ์จะเหมือนกับว่า

var=hello

นิยามตัวแปรทั้งสองนี้เหมือนกันหรือมีความแตกต่างกันหรือไม่?

คำตอบ:


14

ในวงเล็บกรณีของคุณ()จะใช้เป็นคำนิยามอาร์เรย์ตัวอย่างเช่น

a=(one two three)   # array definition
echo "${a}"         # print first element of array a
echo "${a[0]}"      # print first element of array a
echo "${a[1]}"      # print *second* element of array a
echo "${#a[@]}"     # print number of elements in array a

ถ้าคุณใส่ตัวแปรเดี่ยวลงในอาร์เรย์คุณก็จะมีอาร์เรย์ที่มีองค์ประกอบเดียว


หากต้องการตอบคำถามอื่นของคุณว่ามีการใช้วงเล็บในสิ่งอื่นหรือไม่: มีหลายสถานการณ์bashที่ใช้ร่วมกับอักขระอื่น ๆ ที่สามารถใช้เป็น:

  • การทดแทนคำสั่ง: $()
  • การทดแทนกระบวนการ: <()และ>()
  • subshell: (command)
  • การประเมินผลเลขคณิต: (())
  • นิยามฟังก์ชั่น: fun () { echo x; }
  • รายการในรูปแบบ glob: ?(), *(), +(), @(), !()( เฉพาะในกรณีที่extglobมีการเปิดใช้งาน )

1
ใช่ฉันไม่ได้คิดอย่างนั้น แต่var=(1 2 3); echo $varจะเหมือนกันvar=(1 2 3); echo ${var[0]}หรือไม่
Mattias

ใช่ผลลัพธ์bashเหมือนกัน
jimmij

เราจำเป็นต้อง""อยู่ในecho "${a}"?
nn0p

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