2013-07-01 37 views
12

Tôi đã đọc trang bash man về điều này, nhưng tôi không hiểu sự khác biệt. Tôi đã thử nghiệm cả hai và chúng dường như tạo ra kết quả chính xác.

Tôi muốn đặt giá trị mặc định của biến nếu giá trị không được đặt thông qua tham số dòng lệnh.

#!/bin/bash 

var="$1" 
var=${var:-word} 
echo "$var" 

Đoạn mã trên vang word nếu $1 là null và lặp giá trị của $1 nếu không null. Vì vậy, thực hiện điều này:

#!/bin/bash 

var="$1" 
var=${var:=word} 
echo "$var" 

Theo trang người đàn ông Bash,

${parameter:-word} Sử dụng Giá trị mặc định. Nếu tham số không được đặt hoặc null, thì việc mở rộng từ được thay thế. Nếu không, giá trị của tham số được thay thế.

${parameter:=word} Gán giá trị mặc định. Nếu tham số không được đặt hoặc null, thì việc mở rộng từ được gán cho tham số. Giá trị của tham số sau đó được thay thế. Tham số vị trí và tham số đặc biệt có thể không được gán theo cách này.

Có phải chúng giống nhau và ${parameter:=word} chỉ làm được nhiều hơn?

Trả lời

12

Bạn không thể nhìn thấy sự khác biệt với các ví dụ của bạn khi bạn đang sử dụng var hai lần, nhưng bạn có thể nhìn thấy nó với hai biến khác nhau:

foo=${bar:-something} 

echo $foo # something 
echo $bar # no assignement to bar, bar is still empty 

foo=${bar:=something} 

echo $foo # something 
echo $bar # something too, as there's an assignement to bar 
14
${var:=word} 

bằng

var=${var:-word} 
+0

Đẹp và súc tích. – JAB

+0

Giải thích tuyệt vời, tôi cũng thích rằng nó ngắn gọn và súc tích. Tôi đưa ra câu trả lời được chấp nhận cho Guilaume cho lời giải thích thêm và để có câu trả lời đầu tiên. Cảm ơn! –

+0

cho biện pháp tốt, tôi upvoted câu trả lời này quá;) – Guillaume

6

Sự khác biệt là giữa sử dụngphân. Không có số =, giá trị wordđược sử dụng, nhưng không thực sự là được gán đến var.

Điều này quan trọng nhất trong trường hợp các biến chỉ đọc - đó là nơi bạn không thể gán cho chúng.

Ví dụ: bạn không bao giờ có thể gán cho các tham số vị trí được đánh số. Vì vậy, nếu bạn muốn chức năng của bạn để xử lý một tham số đầu tiên bắt buộc với một mặc định, bạn có thể sử dụng mã như:

${1:-default} 

Bạn không thể sử dụng phiên bản ${1:=default} ở đó, kể từ khi bạn không thể gán cho các tham số vị trí 1. Đó là chỉ đọc.

+0

Tôi không biết điều này! Cảm ơn vì thông tin –

2

Bạn đôi khi thấy việc mở rộng phân công với : command:

# set defaults 
: ${foo:=bar} ${baz:=qux}