Cách nói với bash rằng dòng tiếp tục ở dòng tiếp theo


98

Trong một kịch bản bash mà tôi nhận được từ một lập trình viên khác, một số dòng dài hơn 80 cột. Ký tự hoặc sự vật được thêm vào dòng để cho biết dòng tiếp tục ở dòng tiếp theo là gì?


Xem thảo luận bổ sung tại stackoverflow.com/questions/18599711/…
Âm thanh

Câu trả lời:


127

Ký tự là một dấu gạch chéo ngược \

Từ hướng dẫn sử dụng bash :

Ký tự gạch chéo ngược '\' có thể được sử dụng để loại bỏ bất kỳ ý nghĩa đặc biệt nào đối với ký tự tiếp theo được đọc và để tiếp tục dòng.


cảm ơn. và giới hạn thông thường trong các cột của tập lệnh bash là gì?
Mở đường vào

bash không có giới hạn cột thú vị; để rõ ràng, bạn nên cố gắng giới hạn ở 70-80 ký tự mỗi cột.
Habbie

9
@RyanM Dấu gạch chéo ngược phải là ký tự cuối cùng trước ký tự cuối dòng. Bạn có CHẮC CHẮN là bạn không có bất kỳ khoảng trắng nào sau dấu \?
George

9
@George Vâng. Loay hoay một chút nữa thì ra lỗi với a ^M. Vấn đề dường như là tập lệnh đã được đưa cho tôi bởi một người nào đó sử dụng cửa sổ. Một cách nhanh chóng dos2unixcố định nó :)
RyanM

2
@George bình luận của bạn vừa cứu tôi, tôi có một khoảng trống sau dấu \ và tôi không thể tìm ra điều gì sai. Chúc mừng!
ffledgling

36

Nói chung, bạn có thể sử dụng dấu gạch chéo ngược ở cuối dòng để lệnh tiếp tục sang dòng tiếp theo. Tuy nhiên, có những trường hợp các lệnh được tiếp tục một cách ngầm định, cụ thể là khi dòng kết thúc bằng mã thông báo thì không thể kết thúc lệnh một cách hợp pháp. Trong trường hợp đó, trình bao biết rằng sẽ có nhiều hơn và dấu gạch chéo ngược có thể được bỏ qua. Vài ví dụ:

# In general
$ echo "foo" \
> "bar"
foo bar

# Pipes
$ echo foo |
> cat
foo

# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar

Khác nhau, nhưng có liên quan, là sự tiếp diễn ngầm bên trong dấu ngoặc kép. Trong trường hợp này, không có dấu gạch chéo ngược, bạn chỉ cần thêm một dòng mới vào chuỗi.

$ x="foo
> bar"
$ echo "$x"
foo
bar

Với dấu gạch chéo ngược, bạn lại đang tách dòng logic thành nhiều dòng logic.

$ x="foo\
> bar"
$ echo "$x"
foobar

Có một danh sách chính thức về các tình huống như vậy, trong đó một lệnh được tiếp tục ngầm trên dòng tiếp theo không? Đối với tôi, dường như tôi có thể bỏ dấu gạch chéo ngược trong một số trường hợp nhất định trong một [[- ]]điều kiện, nhưng không phải trong những trường hợp khác, và tôi đang cố gắng tìm ra các quy tắc.
Menachem

16

\Làm công việc. Câu trả lời của @ Guillaume và bình luận của @ George đã trả lời rõ ràng câu hỏi này. Ở đây tôi giải thích tại sao The backslash has to be the very last character before the end of line character.Hãy xem xét lệnh này:

   mysql -uroot \
   -hlocalhost      

Nếu có khoảng trắng sau \, việc tiếp tục dòng sẽ không hoạt động. Lý do là \ loại bỏ ý nghĩa đặc biệt cho ký tự tiếp theo là khoảng trắng không phải là ký tự nguồn cấp dòng ẩn. Ký tự nguồn cấp dữ liệu dòng nằm sau dấu cách không có \trong ví dụ này.


2
Cảm ơn bạn đã chỉ ra phần "rất ký tự cuối cùng". Tôi đã nhận được một chút thất vọng khi theo dõi chính xác lỗi này.
Jason
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.