Я пишу сценарий установки, который будет запускаться как /bin/sh
.
Есть строка, подсказывающая файл:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Я хотел бы разбить эту длинную строку на несколько строк, чтобы ни один из них не превышал 80 символов. Я говорю о строках в исходном коде скрипта; не о строках, которые должны быть напечатаны на экране при выполнении скрипта!
Что я пробовал:
Фрист подход:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Это не работает, так как не печатает
Would you like to add this feature? [Y|n]
.Второй подход:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Не работает так же. Он печатает новую строку после подсказки. Добавление
-n
опцииecho
не помогает: просто печатает:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Мой текущий обходной путь
printf '%s %s ' \ "goat can try change directory if cd fails to do so." \ "Would you like to add this feature? [Y|n] " read REPLY
и мне интересно, есть ли лучший способ.
Помните, что я ищу /bin/sh
совместимое решение.
shell
shell-script
string
newlines
bourne-shell
Матеуш Пиотровский
источник
источник
Ответы:
Прежде всего, давайте отделим чтение от текстовой строки с помощью переменной:
Таким образом, возникает проблема: как назначить две строки переменной.
Конечно, первая попытка сделать это, это:
Написано так, что переменная
a
фактически получает значениеline-1 line-2
.Но вам не нравится отсутствие отступов, которое это создает, ну, тогда мы можем попытаться прочитать строки в var из here-документа (имейте в виду, что строки с отступом внутри here-документа требуют табуляции, а не пробелов, работать правильно):
Но это потерпит неудачу, так как на самом деле две строки записаны
$a
. Обходной путь для получения только одной строки может быть:Это близко, но создает другие дополнительные проблемы.
Правильное решение.
Все попытки, приведенные выше, просто сделают эту проблему более сложной, чем она должна быть.
Очень простой и простой подход:
Код для вашего конкретного примера (для любой оболочки, которая
read
поддерживает-p
):Для всех остальных оболочек используйте:
источник
Обратная косая черта в конце строк допускает продолжение команды по нескольким строкам, а не фактические разрывы строк в выходных данных.
Таким образом, ваш первый подход, например, становится командой
Я не уверен, почему вы хотите читать, чтобы вывести несколько строк, но я бы просто использовал
read
для строки подсказки иecho
предыдущей строки (ей).Чтобы сделать код более читабельным в нескольких строках, не закрывайте и не открывайте кавычки между строками.
Попробуй это:
источник
read
имеет отступ внутри функции, то ваш подход может испортить читабельность.Я считаю, что подход @ BinaryZebra, использующий переменную, будет чище, но вы также можете сделать это так, как пытались. Вам просто нужно сохранить разрывы строк внутри кавычек:
источник
\n
в мою подсказку. Я просто хотел разбить код на несколько строк, чтобы каждая строка имела длину не более 80 символов.Как насчет этого:
источник