Estoy escribiendo un script de instalación que se ejecutará como /bin/sh
.
Hay una línea que solicita un archivo:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Me gustaría dividir esta larga línea en muchas líneas para que ninguna de ellas supere los 80 caracteres. Estoy hablando de las líneas dentro del código fuente del script; ¡no se trata de las líneas que realmente se imprimirán en la pantalla cuando se ejecute el script!
Lo que he intentado:
Primer enfoque:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Esto no funciona ya que no se imprime
Would you like to add this feature? [Y|n]
.Segundo enfoque:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
No funciona tan bien Imprime una nueva línea después de la solicitud. Agregar
-n
opción aecho
no ayuda: solo imprime:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Mi solución actual es
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
y me pregunto si hay una mejor manera
Recuerda que estoy buscando una /bin/sh
solución compatible.
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
fuente
fuente
Respuestas:
En primer lugar, desacoplemos la lectura de la línea de texto usando una variable:
De esta manera, el problema se convierte en: Cómo asignar dos líneas a una variable.
Por supuesto, un primer intento de hacer eso es:
Escrito así, la var
a
realmente obtiene el valorline-1 line-2
.Pero no le gusta la falta de sangría que esto crea, bueno, entonces podemos intentar leer las líneas en la var desde un documento aquí (tenga en cuenta que las líneas sangradas dentro del documento aquí necesitan una pestaña, no espacios, para trabajar correctamente):
Pero eso fallaría ya que en realidad se escriben dos líneas
$a
. Una solución para obtener solo una línea podría ser:Eso está cerca, pero crea otros problemas adicionales.
Solución correcta
Todos los intentos anteriores harán que este problema sea más complejo de lo necesario.
Un enfoque muy básico y simple es:
El código para su ejemplo específico es (para cualquier shell cuyos
read
soportes-p
):Para todos los demás depósitos, use:
fuente
La barra diagonal inversa al final de las líneas permite la continuación del comando en varias líneas, no en los saltos de línea reales en la salida.
Entonces, su primer enfoque, por ejemplo, se convierte en el comando
No estoy seguro de por qué quiere leer para generar varias líneas, pero simplemente lo usaría
read
para la línea de solicitud yecho
las líneas anteriores.Para que el código sea más legible en varias líneas, no cierre / abra sus comillas entre líneas.
Prueba esto:
fuente
read
está sangrado dentro de una función, entonces su enfoque parece alterar la legibilidad.Encuentro que el enfoque de @ BinaryZebra utiliza una variable para ser más limpio, pero también puede hacerlo de la manera que intentaba. Solo necesita mantener los saltos de línea dentro de las comillas:
fuente
\n
en mi solicitud. Solo quería dividir el código en varias líneas para que cada línea tenga como máximo 80 caracteres de longitud.¿Qué tal solo esto?
fuente