Как сообщить bash, что строка продолжается на следующей строке

101

В сценарии bash, который я получил от другого программиста, длина некоторых строк превышала 80 столбцов. Какой символ или предмет нужно добавить в строку, чтобы указать, что строка продолжается на следующей строке?

Открыть путь
источник
См. Дополнительное обсуждение на stackoverflow.com/questions/18599711/…
enharmonic

Ответы:

130

Символ - обратная косая черта \

Из руководства bash :

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

Гийом
источник
Спасибо. и каков обычный лимит столбцов в сценарии bash?
Открой путь
bash не имеет интересного ограничения столбца; для ясности вы должны попытаться ограничить до 70-80 символов на столбец.
Habbie
9
@RyanM Обратная косая черта должна быть самым последним символом перед символом конца строки. Вы УВЕРЕНЫ, что у вас нет пробелов после \?
Джордж
9
@ Джордж. Еще немного возни, и вы увидите ошибку с файлом ^M. Проблема, похоже, в том, что сценарий был мне предоставлен кем-то, кто использует окна. Быстро dos2unixисправил :)
RyanM
2
@ Джордж, ваш комментарий только что спас меня, у меня был пробел после \, и я не мог понять, что не так. Ура!
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

\делает свою работу. Ответ @ Guillaume и комментарий @ George четко отвечают на этот вопрос. Здесь я объясняю, почему The backslash has to be the very last character before the end of line character.рассмотрите эту команду:

   mysql -uroot \
   -hlocalhost      

Если после стоит пробел \, продолжение строки работать не будет. Причина в том, что \ удаляет специальное значение для следующего символа, который является пробелом, а не невидимым символом перевода строки. В \этом примере символ перевода строки стоит после пробела .

Цзинго Яо
источник
2
Спасибо, что указали на «самый последний персонаж». Я немного расстраивался, отслеживая именно эту ошибку.
Джейсон