Niềng răng ( $var
so với ${var}
)
Trong hầu hết các trường hợp, $var
và ${var}
đều giống nhau:
var=foo
echo $var
# foo
echo ${var}
# foo
Niềng răng chỉ cần thiết để giải quyết sự mơ hồ trong biểu thức:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Báo giá ( $var
so "$var"
với vs."${var}"
)
Khi bạn thêm dấu ngoặc kép xung quanh một biến, bạn nói với shell để coi nó là một từ duy nhất, ngay cả khi nó chứa khoảng trắng:
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
Tương phản hành vi đó với những điều sau đây:
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
Như với $var
so với ${var}
, niềng răng chỉ cần thiết cho sự định hướng, ví dụ:
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
Lưu ý rằng "${var}bar"
trong ví dụ thứ hai ở trên cũng có thể được viết "${var}"bar
, trong trường hợp đó bạn không cần niềng răng nữa, tức là "$var"bar
. Tuy nhiên, nếu bạn có nhiều trích dẫn trong chuỗi của mình, các hình thức thay thế này có thể khó đọc (và do đó khó duy trì). Trang này cung cấp một giới thiệu tốt để trích dẫn trong Bash.
Mảng ( $var
so $var[@]
với so với ${var[@]}
)
Bây giờ cho mảng của bạn. Theo hướng dẫn sử dụng bash :
Tham chiếu một biến mảng không có chỉ mục con tương đương với tham chiếu mảng có chỉ số 0.
Nói cách khác, nếu bạn không cung cấp chỉ mục []
, bạn sẽ nhận được phần tử đầu tiên của mảng:
foo=(a b c)
echo $foo
# a
Điều này giống hệt như
foo=(a b c)
echo ${foo}
# a
Để có được tất cả các phần tử của một mảng, bạn cần sử dụng @
làm chỉ mục, ví dụ ${foo[@]}
. Các dấu ngoặc được yêu cầu với các mảng vì không có chúng, shell sẽ mở rộng $foo
phần đầu tiên, đưa ra phần tử đầu tiên của mảng theo sau là một chữ [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Trang này là một giới thiệu tốt về mảng trong Bash.
Trích dẫn xem lại ( ${foo[@]}
so với "${foo[@]}"
)
Bạn đã không hỏi về điều này nhưng đó là một sự khác biệt tinh tế rất tốt để biết về nó. Nếu các phần tử trong mảng của bạn có thể chứa khoảng trắng, bạn cần sử dụng dấu ngoặc kép để mỗi phần tử được coi là một "từ:" riêng biệt
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
Tương phản điều này với hành vi không có dấu ngoặc kép:
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
kịch bản?