Dấu ngoặc đơn trong phép gán biến bash


11

Tôi đã tự hỏi về dấu ngoặc đơn trong bash. Tôi biết rằng chúng được sử dụng để thực hiện các lệnh trong subshells và chúng được sử dụng để tạo mảng, nhưng chúng có được sử dụng cho bất cứ điều gì khác không?

Một điều khiến tôi chú ý là khi bạn sử dụng phép gán biến, như

var=(hello)
echo $var    # hello

bash không tạo ra lỗi hoặc bất cứ điều gì và đầu ra giống như khi

var=hello

Là hai định nghĩa biến giống nhau hay có sự khác biệt?

Câu trả lời:


14

Trong trường hợp dấu ngoặc đơn của bạn ()được sử dụng làm định nghĩa mảng, ví dụ

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

Nếu bạn đặt một biến duy nhất trong mảng thì bạn chỉ có một mảng với phần tử đơn.


Để trả lời câu hỏi khác của bạn, liệu dấu ngoặc đơn cũng được sử dụng cho bất kỳ điều gì khác: có nhiều tình huống trong bashđó kết hợp với các ký tự khác, chúng có thể được sử dụng như:

  • thay thế lệnh: $()
  • thay thế quá trình: <()>()
  • subshell: (command)
  • đánh giá số học: (())
  • định nghĩa hàm: fun () { echo x; }
  • danh sách mẫu trong glob: ?(), *(), +(), @(), !()( chỉ nếu extgloblà cho phép )

1
Phải, tôi thực sự đã không nghĩ về điều đó. Nhưng như vậy var=(1 2 3); echo $varcó giống như var=(1 2 3); echo ${var[0]}?
Mattias

Vâng, kết quả trong bashlà như nhau.
jimmij

Chúng ta có cần ""trong echo "${a}"không?
nn0p

@ nn0p Có, chúng tôi làm, nếu chúng tôi không muốn thực hiện thao tác phân tách và toàn cầu trên a. Xem xét ví dụ a=*, sau đó thử echo $aecho "$a".
jimmij
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.