Piszę skrypt instalacyjny, który będzie uruchamiany jako /bin/sh
.
Jest wiersz z pytaniem o plik:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Chciałbym podzielić tę długą linię na wiele linii, aby żaden z nich nie przekraczał 80 znaków. Mówię o wierszach w kodzie źródłowym skryptu; nie chodzi o wiersze, które mają być faktycznie wydrukowane na ekranie podczas wykonywania skryptu!
Co próbowałem:
Pierwsze podejście:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
To nie działa, ponieważ nie jest drukowane
Would you like to add this feature? [Y|n]
.Drugie podejście:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Nie działa tak dobrze. Drukuje znak nowej linii po znaku zachęty. Dodanie
-n
opcji doecho
nie pomaga: po prostu drukuje:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Moje obecne obejście to
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
i zastanawiam się, czy jest lepszy sposób.
Pamiętaj, że szukam /bin/sh
kompatybilnego rozwiązania.
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
źródło
źródło
Odpowiedzi:
Przede wszystkim oddzielmy odczyt od wiersza tekstu za pomocą zmiennej:
W ten sposób pojawia się problem: Jak przypisać dwie linie do zmiennej.
Oczywiście pierwszą próbą zrobienia tego jest:
W ten sposób var
a
otrzymuje wartośćline-1 line-2
.Ale nie podoba ci się brak wcięcia, które to powoduje, więc możemy spróbować odczytać wiersze do var z dokumentu doc (pamiętaj, że wcięte linie wewnątrz dokumentu doc wymagają tabulacji, a nie spacji, działać poprawnie):
Ale to by się nie powiodło, ponieważ tak naprawdę napisane są dwa wiersze
$a
. Obejściem uzyskania tylko jednej linii może być:To blisko, ale stwarza inne dodatkowe problemy.
Prawidłowe rozwiązanie
Wszystkie powyższe próby sprawią, że problem będzie bardziej złożony, niż powinien.
Bardzo podstawowym i prostym podejściem jest:
Kod dla Twojego konkretnego przykładu to (dla dowolnej powłoki, która
read
obsługuje-p
):Dla wszystkich innych powłok użyj:
źródło
Odwrotny ukośnik na końcu linii pozwala na kontynuację polecenia na wielu liniach, a nie na rzeczywiste podziały linii na wyjściu.
Na przykład twoje pierwsze podejście staje się rozkazem
Nie jestem pewien, dlaczego chcesz czytać, aby wyprowadzić wiele wierszy, ale po prostu
read
użyłbym linii wiersza iecho
poprzednich linii.Aby kod był bardziej czytelny w wielu wierszach, nie zamykaj / nie otwieraj cudzysłowów między wierszami.
Spróbuj tego:
źródło
read
jest wcięte w funkcji, twoje podejście wydaje się popsuć czytelność.Uważam, że podejście @ BinaryZebra jest oparte na zmiennej, aby być czystszym, ale możesz także zrobić to tak, jak próbowałeś. Musisz tylko zachować podział wiersza w cudzysłowie:
źródło
\n
do mojego monitu. Chciałem tylko podzielić kod na wiele linii, aby każda linia miała maksymalnie 80 znaków.A co z tym właśnie:
źródło