2012-12-31 27 views
8

thể trùng lặp:
Ternary operator (?:) in BashCó nội tuyến-nếu có gán (điều kiện ba năm) trong bash không?

Nếu đây là AS3 hoặc Java, tôi sẽ làm như sau:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 

Nhưng trong vỏ, điều đó dường như không cần thiết phức tạp, đòi hỏi một số dòng mã, cũng như khá nhiều mã lặp lại.

if [ $useDefault ]; then 
    fileName="$dirName/$defaultName.txt" 
else 
    fileName="$dirName/$customName.txt" 
fi 

Bạn có thể nén tất cả thành một dòng, nhưng sự hy sinh đó rõ ràng vô cùng.

Có cách nào tốt hơn để viết nội tuyến if có gán biến trong vỏ không?

+0

Câu trả lời của William Purcell ít trực tiếp hơn của tôi, nhưng nếu giả định rằng '$ useDefault' kiểm soát việc sử dụng tên mặc định hay không, nó có thể là một giải pháp sạch hơn. –

+0

Tôi đã cập nhật câu trả lời của mình để trích dẫn mọi thứ đúng cách. –

Trả lời

9

Không có ?: nhà điều hành có điều kiện trong vỏ, nhưng bạn có thể làm cho đoạn code một chút ít dư thừa như thế này:

if [ $useDefault ]; then 
    tmpname="$defaultName" 
else 
    tmpname="$customName" 
fi 
fileName="$dirName/$tmpname.txt" 

Hoặc bạn có thể viết chức năng vỏ của riêng bạn mà đóng vai trò như các nhà điều hành ?::

cond() { 
    if [ "$1" ] ; then 
     echo "$2" 
    else 
     echo "$3" 
    fi 
} 

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt" 

mặc dù đó có thể là quá mức cần thiết (và nó đánh giá cả ba đối số).

Nhờ Gordon Davisson đã chỉ ra trong các nhận xét báo giá tổ trong phạm vi $(...).

+0

Tôi thực sự thích chức năng 'cond', đó là lý do tôi chấp nhận câu trả lời, mặc dù giải pháp đầu tiên không lưu mã lặp lại. – IQAndreas

+0

Bạn nên để '$ (cond ...)' bên trong dấu ngoặc kép (tức là 'fileName =" $ dirname/$ (cond "$ useDefault" "$ defaultName" "$ customName"). Txt "') - - điều đó sẽ ngăn chặn việc phân tích cú pháp thêm gần như không mong muốn trên chuỗi trả về. –

+0

@GordonDavisson: Tôi đã nghĩ về điều đó, nhưng nó để lại tham chiếu biến '$ useDefault' et al bên ngoài dấu ngoặc kép. Tôi không chắc là có giải pháp tốt. –

16

Chỉ cần viết:

fileName=${customName:-$defaultName}.txt 

Nó không hoàn toàn giống như những gì bạn có, vì nó không kiểm tra useDefault. Thay vào đó, nó chỉ kiểm tra nếu customName được đặt. Thay vì đặt useDefault khi bạn muốn sử dụng mặc định, bạn chỉ cần bỏ đặt số customName.

+0

Bạn có thể cung cấp thêm thông tin về toán tử ': -' này không? (hoặc ít nhất là một số tên cho nó mà tôi có thể tìm kiếm với Google) – IQAndreas

+1

Chỉ cần tìm kiếm ': -' trong trang bash man. Bất kỳ tài liệu 'sh' nào sẽ mô tả điều này trong các tiêu đề như' mở rộng tham số'. –

+4

Đối với 'bash', xem [mở rộng tham số] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion); đối với vỏ POSIX, hãy xem [mở rộng tham số] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02). –

Các vấn đề liên quan