วงเล็บปีกกา ( $var
เทียบกับ${var}
)
ในกรณีส่วนใหญ่$var
และ${var}
เหมือนกัน:
var=foo
echo $var
# foo
echo ${var}
# foo
ต้องใช้วงเล็บปีกกาเพื่อแก้ไขความคลุมเครือในนิพจน์เท่านั้น:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
คำพูด ( $var
เทียบ"$var"
กับ"${var}"
)
เมื่อคุณเพิ่มเครื่องหมายคำพูดคู่รอบตัวแปรคุณจะบอกให้เชลล์ถือว่าเป็นคำเดียวแม้ว่าจะมีช่องว่างก็ตาม:
var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
echo $i # so only runs the loop once
done
# foo bar
ตรงกันข้ามกับพฤติกรรมดังต่อไปนี้:
var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
echo $i # so runs the loop twice, once for each argument
done
# foo
# bar
เช่นเดียวกับ$var
กับ${var}
วงเล็บปีกกานั้นจำเป็นสำหรับการลดความสับสนเท่านั้นเช่น:
var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
echo $i # variable named 'varbar', so loop runs once and
done # prints nothing (actually "")
var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
echo $i # so runs the loop once
done
# foo barbar
โปรดทราบว่า"${var}bar"
ในตัวอย่างที่สองข้างต้นสามารถเขียนได้"${var}"bar
ซึ่งในกรณีนี้คุณไม่จำเป็นต้องใช้เครื่องมือจัดฟันอีกต่อไปเช่น"$var"bar
ซึ่งในกรณีที่คุณไม่จำเป็นต้องจัดฟันอีกต่อไปคืออย่างไรก็ตามหากคุณมีเครื่องหมายคำพูดจำนวนมากในสตริงของคุณรูปแบบทางเลือกเหล่านี้อาจอ่านยาก (และยากที่จะดูแลรักษา) หน้านี้ให้ข้อมูลเบื้องต้นที่ดีเกี่ยวกับการอ้างอิงใน Bash
อาร์เรย์ ($var
เทียบ$var[@]
กับ${var[@]}
)
ตอนนี้สำหรับอาร์เรย์ของคุณ ให้เป็นไปตามคู่มือทุบตี :
การอ้างอิงตัวแปรอาร์เรย์โดยไม่มีตัวห้อยจะเทียบเท่ากับการอ้างอิงอาร์เรย์ด้วยตัวห้อยเป็น 0
กล่าวอีกนัยหนึ่งถ้าคุณไม่ได้ใส่ดัชนี[]
คุณจะได้รับองค์ประกอบแรกของอาร์เรย์:
foo=(a b c)
echo $foo
# a
ซึ่งก็เหมือนกับ
foo=(a b c)
echo ${foo}
# a
เพื่อให้ได้องค์ประกอบทั้งหมดของอาร์เรย์คุณต้องใช้เป็นดัชนีเช่น@
${foo[@]}
ต้องใช้วงเล็บปีกกากับอาร์เรย์เพราะหากไม่มีพวกเขาเชลล์จะขยาย$foo
ส่วนก่อนโดยให้องค์ประกอบแรกของอาร์เรย์ตามด้วยลิเทอรัล[@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
หน้านี้เป็นข้อมูลเบื้องต้นที่ดีเกี่ยวกับอาร์เรย์ใน Bash
อ้างถึงคำพูด (${foo[@]}
เทียบกับ"${foo[@]}"
)
คุณไม่ได้ถามเกี่ยวกับเรื่องนี้ แต่เป็นความแตกต่างเล็กน้อยที่ควรรู้ หากองค์ประกอบในอาร์เรย์ของคุณมีช่องว่างได้คุณต้องใช้เครื่องหมายคำพูดคู่เพื่อให้แต่ละองค์ประกอบถือว่าเป็น "คำ" ที่แยกจากกัน
foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
echo $i # so the loop runs twice
done
# the first
# the second
ตรงกันข้ามกับพฤติกรรมที่ไม่มีเครื่องหมายอัญประกาศคู่:
foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
echo $i # so the loop runs four times!
done
# the
# first
# the
# second
bash
สคริปต์ได้อย่างไร?