Phân công có điều kiện dựa trên biến môi trường


11

Trong tập lệnh bash, tôi chỉ định một biến cục bộ để giá trị phụ thuộc vào biến môi trường toàn cầu bên ngoài ( $MYAPP_ENV).

if [ "$MYAPP_ENV" == "PROD" ]
then
    SERVER_LOGIN=foobar123@prod.example.com
else
    SERVER_LOGIN=foobar987@test.example.com
fi

Có cách nào ngắn hơn (chưa sạch) để viết bài tập trên không? (Có lẽ sử dụng một số loại toán tử / nội tuyến có điều kiện nếu.)

Câu trả lời:


17

Bạn cũng có thể sử dụng case / switch in bashđể làm điều này:

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="foobar123@prod.example.com" ;;
    *) SERVER_LOGIN="foobar987@test.example.com" ;;
esac

Hoặc phương pháp này:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com

2
Một tuyên bố trường hợp dễ đọc hơn nhiều so với việc đưa tất cả vào một dòng (có thể kết thúc trong thảm họa nếu lệnh thứ hai có thể thất bại, trong trường hợp này, nó vẫn ổn, nhưng việc tập thói quen đó có thể tốn kém). Đây là phương pháp tốt nhất khi xử lý các trường hợp như thế này.
Chris Xuống

@Jonik - vui lòng chấp nhận một trong những câu trả lời nếu nó đáp ứng nhu cầu của bạn để người khác biết rằng vấn đề của bạn đã được giải quyết. Cảm ơn.
slm

Tôi đoán rằng tuyên bố trường hợp là sạch nhất trong số các tùy chọn được trình bày, ngay cả khi nó không chính xác những gì tôi đang tìm kiếm. Ồ, cú pháp Bash thật khó xử, không thể khắc phục điều đó. :)
Jonik

1
@Jonik - đó cũng là phát hiện của tôi. Hãy tin tôi, tôi đã tìm kiếm các lựa chọn thay thế, tôi thích các dòng rộng làm nhiều hơn là các chương trình dài và if / then / other cũng rất dài cho thị hiếu của tôi.
slm

9

Thử:

[ condition ] && var=value_when_true || var=value_when_false

Nếu bài tập của bạn là số, bạn có thể sử dụng bashthao tác ternary:

(( assign_condition ? value_when_true : value_when_false ))

1
Các cựu không phải là ternary. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Xuống

@chris - đúng, nhưng nó vẫn là một câu trả lời thực tế tốt ngay cả khi thuật ngữ này không hoàn toàn đúng.
cas

@CraigSanders Thuật ngữ có vấn đề - Tôi thấy cách này được sử dụng quá thường xuyên trong các tập lệnh khi lệnh thứ hai có thể thất bại.
Chris Xuống

@ChrisDown: Thực hiện chỉnh sửa cho câu trả lời, bây giờ có tốt hơn không?
cuonglm

1
Lol trong 2,5 năm để chỉnh sửa cuonglm!
iruvar

4

Bạn có thể sử dụng &&||toán tử

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
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.