Bash nếu trên một dòng


50

Tôi muốn biết làm thế nào tôi có thể viết nếu các điều kiện bên trong một tập lệnh bash trên một dòng.

Ví dụ, làm thế nào tôi có thể viết cái này trên một dòng, và sau đó đặt một cái khác giống như nó trên dòng tiếp theo?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Tôi hỏi điều này bởi vì tôi có khá nhiều bí danh trong .bashrc và tôi có cùng một .bashrc (được đồng bộ hóa) trên nhiều hệ thống, nhưng tôi không cần tất cả các bí danh trên mỗi hệ thống. Tôi đặt hầu hết chúng vào trong các câu lệnh if và hiện tại nó đang hoạt động rất tốt nhưng chúng chiếm rất nhiều không gian, mỗi dòng có 3 dòng cộng với dòng trống giữa chúng (tôi thích có thể nhìn thấy chúng dễ dàng)

Tôi cũng sẽ sử dụng kỹ thuật này cho các biến môi trường.


4
Bạn cũng có thể viết[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman

3
Hãy nhớ rằng ngắn hơn không nhất thiết phải tốt hơn. Bạn có thể nhận được các lỗi logic tinh vi với các toán tử logic của shell. Chọn những gì dễ đọc hơn và duy trì.
glenn jackman

Câu trả lời:


83

Bạn sẽ viết nó như vậy:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Lưu ý rằng điều này cũng có thể được viết (như được đề xuất bởi @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32

1
Chà điều đó thật dễ dàng ... :) Bây giờ tôi cảm thấy hơi khó xử khi hỏi điều đó. Cảm ơn bạn đã trả lời tho, nó đã giúp rất nhiều!
Horațiu Mlendea

7
Có một sự khác biệt. 1. biểu thức sẽ thoát với trạng thái 0, 2. biểu thức sẽ thoát với trạng thái không 0 nếu tệp không tồn tại. Điều này có thể tạo sự khác biệt nếu bạn sử dụng điều này trong một số tác vụ tự động như triển khai trong đó nhiệm vụ thành công phụ thuộc vào trạng thái thoát lệnh.
Jāni Gruzis

@ HorațiuMlendea rõ ràng là dễ dàng. nếu bạn biết cách Nhưng cú pháp rất khó, ví dụ [1 == 1] là một lỗi nhưng [1 == 1] hoạt động. Và dấu chấm phẩy. Làm thế nào bạn có thể cảm thấy lúng túng vì không biết một số cú pháp được thiết kế tồi. "Cảm giác" của bạn chẳng có ý nghĩa gì cả. Đây là một câu hỏi hữu ích, ngay cả khi không may bạn không hiểu tại sao.
barlop

@balop không, tôi hoàn toàn thấy ý của bạn và tôi đồng ý. Tại thời điểm đó, tôi đã hiểu các bit riêng lẻ tạo nên cú pháp đó (một bit có &&). Thông thường sẽ dễ dàng và trực quan để đặt mọi thứ lại với nhau, nhưng như bạn đã nói, ngôn ngữ này khá khó và không trực quan lắm.
Horațiu Mlendea

4

Tôi cũng thấy rằng chỉ cần gõ bất kỳ phức tạp nào nếu lệnh khác, nhấn enter và sau đó sau khi thực thi, chỉ cần nhấn mũi tên lên. Tất nhiên, dòng lệnh sẽ lặp lại lệnh gõ cuối cùng, nhưng trong trường hợp này, nó sẽ đặt tất cả trên một dòng theo yêu cầu của bạn. Đó là một cách gian lận, nhưng nó hiệu quả.


5
Lưu ý rằng điều này có thể phụ thuộc vào vỏ của bạn (và có thể hơn nữa vào cài đặt của vỏ của bạn). Một số thử nghiệm nhanh trên máy tính của tôi cho thấy điều này hoạt động ở Bash (vì vậy có +1), nhưng Zsh bảo toàn ngắt dòng khi quay lại các lệnh trước đó.
8bittree
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.