2013-09-03 22 views
219

Làm cách nào để có thể chia lệnh trên nhiều dòng trong trình bao, khi lệnh là một phần của câu lệnh if?Làm cách nào để phân chia lệnh trình bao trên nhiều dòng khi sử dụng câu lệnh IF?

Trong khi làm việc này:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                  
fi 

Đây không phải đang làm việc:

# does not work: 
if ! fab --fabfile=.deploy/fabfile.py \ 
    --forward-agent \ 
    --disable-known-hosts deploy:$target; then 
    rc=1 
fi 

Thay vì toàn bộ lệnh thực hiện, tôi nhận được:

./script.sh: line 73: --forward-agent: command not found 

Quan trọng hơn, những gì là mất tích từ sự hiểu biết của tôi về Bash sẽ giúp tôi hiểu điều này và các vấn đề tương tự trong tương lai?

+1

Lỗi là gì? Tôi có thể thực thi '$ if! cp -n log/server1.log \ >.; sau đó echo không sao chép; fi' không có lỗi, với dòng mới sau '\' –

+11

Bạn có dấu cách sau dấu gạch chéo ngược '\' không? Họ rất khó nhìn thấy. Nếu bạn làm như vậy, bạn có thể muốn xem liệu bạn có thể làm cho trình chỉnh sửa của mình xóa dấu cách hay làm cho chúng hiển thị rõ hơn. – msw

+4

Có, đó là khoảng trống sau dấu gạch chéo ngược của thiết bị đầu cuối. Hoàn toàn. Cảm ơn bạn. –

Trả lời

324

Việc tiếp tục dòng sẽ không thành công nếu bạn có khoảng trắng (dấu cách hoặc ký tự tab) sau dấu gạch chéo ngược và trước dòng mới. Không có khoảng trắng như vậy, ví dụ của bạn hoạt động tốt đối với tôi:

$ cat test.sh 
if ! fab --fabfile=.deploy/fabfile.py \ 
    --forward-agent \ 
    --disable-known-hosts deploy:$target; then 
    echo failed 
else 
    echo succeeded 
fi 

$ alias fab=true; . ./test.sh 
succeeded 
$ alias fab=false; . ./test.sh 
failed 
+4

Đánh dấu, bạn biết đấy, tôi phải có khoảng trắng. Tôi chỉ có thể tạo lại lỗi khi thêm khoảng trắng sau '\' s. Ví dụ, khi thêm một cái sau '\' đầu tiên, tôi nhận được './soundops: dòng 73: --forward-agent: không tìm thấy lệnh'. Vấn đề của tôi là tôi không hiểu lỗi này. Tại sao có kết quả khoảng trắng trong lỗi đó? Khoảng trắng + '\ n'" phủ nhận "\" và phân định một lệnh? –

+52

Dấu gạch chéo ngược ở phía trước dòng mới ngăn dòng mới chấm dứt lệnh. Nhưng cũng giống như các chuỗi thoát đặc biệt như "\ n" chỉ hoạt động với không có gì giữa dấu gạch chéo ngược và n, dấu gạch chéo ngược-dòng mới chỉ hoạt động với không có gì giữa dấu gạch chéo ngược và dòng mới. –

+8

Hahaha wow, tất nhiên là có ý nghĩa. Không bao giờ thấy nó theo cách đó. Mở mắt, nhưng đơn giản như vậy: nó chỉ là một dòng mới thoát. Tôi ghét những nhân vật vô hình. Họ sẽ có ý nghĩa hơn với tôi nếu tất cả họ đều có thể nhìn thấy được. Cảm ơn bạn! –

19

Đối với Windows/Cygwin vv người dùng /:

Make cũng chắc chắn rằng kết thúc dòng của bạn là tiêu chuẩn dòng Unix nguồn cấp dữ liệu, tức là \n (LF) chỉ . Có kết thúc dòng Windows \r\n (CRLF) sẽ phá vỡ nó.

+0

Điều này khắc phục sự cố được tạo khi tạo tập lệnh trong Windows và sau đó sử dụng nó trong Windows bash (ví dụ: bash -c MyShellScript.sh nơi MyShellScript.sh được tạo trong trình chỉnh sửa Windows).Bạn phải lưu MyShellScript.sh ở định dạng UNIX có thể sử dụng notepad ++. – BSalita

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