2013-02-28 29 views
22

tôi thừa hưởng một số mã bash và hai dòng này được bối rối tôi:Toán tử dấu hai chấm Bash trong sự thay thế biến thiên?

branch_name=`git describe --contains --all HEAD` 
branch_name=${branch_name:-HEAD} 

sự hiểu biết của tôi về các nhà điều hành ruột : được đó là tạo ra một chuỗi dựa trên một chỉ số để sử dụng một chuỗi, -HEAD trong trường hợp này, không không có ý nghĩa gì cả.

Trả lời

26

Điều này có biến số branch_name, nếu được xác định. Nếu nó không được xác định, hãy sử dụng HEAD để thay thế.

Xem Shell Parameter Expansion để biết chi tiết.

Nền con được bao phủ một vài dòng bên dưới. Sự khác biệt giữa hai là

${parameter:-word} 

vs

${parameter:offset} 
${parameter:offset:length} 
+0

Câu trả lời hay. Cảm ơn bạn đã liên kết Olaf. Điều này làm rõ mọi thứ cho tôi. –

+0

Và điều gì sẽ xảy ra nếu chỉ có ': -'? LIke "$ {RDAUTH: -}" – willemdh

+0

Điều này hoạt động giống như một chuỗi rỗng, tt cung cấp nội dung của 'RDAUTH' hoặc một chuỗi rỗng. –

6

Trong bash, ${VAR1:-VAR2} tương đương với SQL của coalesce(VAR1, VAR2), hoặc C# 's VAR1 ?? VAR2.

Trong trường hợp của bạn:

branch_name=`git describe --contains --all HEAD` 
branch_name=${branch_name:-HEAD} 

Dòng đầu tiên thực hiện lệnh git và đặt giá trị trong biến branch_name, sau đó, dòng thứ hai coalesces giá trị của nó gán giá trị của HEAD nếu branch_name là null.

Như bạn nói ${VAR1:NUM} là một hoạt động chuỗi tiền tố (left trong SQL), mà khi được sử dụng với một số tiêu cực, như ${VAR1: -NUMBER} trở thành một hậu tố (right) hoạt động. Lưu ý khoảng trắng trước dấu trừ: nếu bạn bỏ qua khoảng trống đó, nó sẽ trở thành hoạt động coalesce như tôi đã nói trước đây.

12

Trong trường hợp này, dấu hai chấm chỉ là công cụ sửa đổi cho toán tử -. ${branch-HEAD} sẽ chỉ mở rộng thành "HEAD" nếu branch không được đặt, trong khi ${branch:-HEAD} mở rộng thành "HEAD" nếu branch cũng là chuỗi rỗng.

$ branch=master 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
master + master 
$ branch="" 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
+ HEAD 
$ unset branch 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
HEAD + HEAD 
Các vấn đề liên quan