Як сказати bash, що рядок продовжується на наступному рядку


99

У сценарії bash, який я отримав від іншого програміста, довжина деяких рядків перевищувала 80 стовпців. Який символ або річ слід додати до рядка, щоб вказати, що рядок продовжується на наступному рядку?


Див. Додаткове обговорення на stackoverflow.com/questions/18599711/…
енгармонія

Відповіді:


127

Персонаж є зворотною рискою рискою \

З посібника з Bash :

Символ зворотної косої риски '\' може бути використаний для видалення будь-якого особливого значення для наступного прочитаного символу та продовження рядка.


Дякую. і яке звичайне обмеження в стовпцях сценарію bash?
Відкрийте шлях

bash не має цікавого обмеження стовпців; для наочності вам слід спробувати обмежити до 70-80 символів на колонці.
Хаббі

9
@RyanM Коса коса риса повинна бути самим останнім символом перед символом кінця рядка. Ви впевнені, що після \ не залишається пробілів?
Джордж

9
@George Так. Трохи більше возитися виплюнути помилку з ^M. Проблема полягає в тому, що сценарій мені передав той, хто використовує Windows. Швидко dos2unixце виправили :)
RyanM

2
@George Ваш коментар щойно врятував мене, у мене залишився пробіл після \ і я не міг зрозуміти, що сталося. Ура!
ffledgling

37

Загалом, ви можете використовувати зворотну скісну риску в кінці рядка, щоб команда продовжила наступний рядок. Однак бувають випадки, коли команди неявно продовжуються, а саме, коли рядок закінчується маркером, ніж не може законно завершити команду. У цьому випадку оболонка знає, що надходить більше, і зворотну косу риску можна опустити. Деякі приклади:

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

# Pipes
$ echo foo |
> cat
foo

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

Різним, але пов’язаним, є неявне продовження всередині лапок. У цьому випадку без зворотної скісної риски ви просто додаєте новий рядок до рядка.

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

За допомогою зворотної косої риски ви знову ділите логічний рядок на кілька логічних рядків.

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

Чи існує офіційний список таких ситуацій, коли команда неявно продовжується до наступного рядка? Мені здається , що я міг би залишити зворотну косу риску в певних обставинах в [[- ]]стан, але не в інших, і я намагаюся з'ясувати правила.
Менахем

16

\робить роботу. Відповідь @ Гійома та коментар @ George чітко відповідають на це питання. Тут я пояснюю, чому The backslash has to be the very last character before the end of line character.розглянемо цю команду:

   mysql -uroot \
   -hlocalhost      

Якщо після є пробіл \, продовження рядка не буде працювати. Причина полягає в тому, що \ вилучається особливе значення для наступного символу, який є пробілом, а не символом подачі невидимих ​​рядків. Символ рядка подається після пробілу, не вказаного \в цьому прикладі.


2
Дякуємо, що вказали на частину "останнього персонажа". Я отримував трохи розчарування відстежуючи саме цю помилку.
Джейсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.