Giải thích về toán tử dấu hai chấm trong “: $ {foo = value}”


78

Tôi hiểu toán tử dấu hai chấm trong bash hoạt động giống như null và tôi biết nó được sử dụng trong việc mở rộng tham số , cũng như được sử dụng theo các cách khác, nhưng ai đó có thể giải thích điều này:

: ${SOMETHING='value'}

Từ thử nghiệm, tôi biết rằng điều này đặt biến môi trường $SOMETHINGthành 'value'nhưng tại sao?

"Just because it does" là một câu trả lời hợp lệ nhưng sau đó vui lòng chỉ cho tôi tài liệu về nó (mà tôi dường như không thể tìm thấy) hoặc một tên riêng cho cách sử dụng này sẽ hữu ích. Tôi hy vọng có một lời giải thích sáng suốt hơn.


2
Lưu ý rằng tích :hợp sẵn tồn tại trong bourne shell và ksh cũng như bash.
ghoti 13/09/12

Câu trả lời:


96

Biểu thức ${SOMETHING='value'}đặt SOMETHING thành valuenếu nó chưa được đặt. Đây là một toán tử hữu ích cần có trong nhiều tình huống. Tuy nhiên, nó cũng trả về giá trị được chỉ định, vì vậy nếu bạn chỉ thực hiện

${SOMETHING='value'}

thì shell của bạn sẽ cố gọi lệnh value. Điều này có thể có hoặc không làm điều gì đó không mong muốn; ít nhất nó sẽ ném ra một thông báo "value: command not found".

Để tránh điều này, bạn có thể sử dụng no-op :, đánh giá đối số của nó và sau đó ném nó đi, thay vì thực hiện nó. Điều này được ghi lại ở đây .


13
Lệnh :nội trang được ghi lại ở đây . Nó cũng là một tiêu chuẩn POSIX .
Adam Rosenfield

3
Cũng được giải thích ở đây .
x-yuri

2
có sự khác biệt nào giữa: $ {SOMETHING = "$ HMMM"} và: $ {SOMETHING: = "$ HMMM"} không? lưu ý dấu hai chấm thứ hai trong ví dụ cuối cùng
Yury Kozlov

2
@YuryKozlov Biến thể đầu tiên ( =) sẽ sử dụng giá trị mặc định nếu tham số là unset; sau này ( :=) sẽ sử dụng mặc định nếu tham số là null hay unset
Dave L.

7

Giải thích tại đây: http://tldp.org/LDP/abs/html/parameter-substitution.html

Nếu tham số không được đặt, hãy đặt nó thành mặc định.

Cả hai dạng gần như tương đương. Dấu: chỉ tạo ra sự khác biệt khi tham số $ đã được khai báo và là giá trị rỗng, [1] như trên.

echo ${var=abc}   # abc
echo ${var=xyz}   # abc
# $var had already been set to abc, so it did not change.

3
Tôi đề xuất wiki.bash-hackers.org/syntax/pe hoặc mywiki.wooledge.org/BashFAQ/073 (và các liên kết của nó) làm tài liệu tham khảo tốt hơn ABS (vốn thường xuyên không bị phai màu và có xu hướng thể hiện các hoạt động xấu trong ví dụ của nó).
Charles Duffy
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.