Tengo una variable multilínea, y solo quiero la primera línea en esa variable. El siguiente script demuestra el problema:
#!/bin/bash
STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"
echo " Take the first line and send to standard output:"
echo ${STRINGTEST%%$'\n'*}
# Output is as follows:
# Onlygetthefirstline
echo " Set the value of the variable to the first line of the variable:"
STRINGTEST=${STRINGTEST%%$'\n'*}
echo " Send the modified variable to standard output:"
echo $STRINGTEST
# Output is as follows:
# Onlygetthefirstline butnotthesecond orthethird
Pregunta: ¿Por qué ${STRINGTEST%%$'\n'*}devuelve la primera línea cuando se coloca después de un echocomando, pero reemplaza las nuevas líneas con espacios cuando se coloca después de la asignación?

$'...'lugar de bash.Respuestas:
Quizás haya otra forma de archivar lo que quieres hacer, pero esto funciona
fuente
$STRINGTESTno contienen espacios en blanco o comodines. También tenga en cuenta que las líneas vacías (como en la primera línea de esa variable) se ignoran.STRINGTEST=(${STRINGTEST[@]})tiene poco sentido y es equivalente aSTRINGTEST=($STRINGTEST)ya queSTRINGTESTse definió previamente como una variable escalar (no matriz ).puede que no sea más eficiente, pero un revestimiento ...
fuente
firstLine=`echo "${test_var}" | sed -n 1ptambién funciona si usted tiene una razón para usar sed en su lugar (por ejemplo, significa que se pueden realizar al mismo tiempo un reemplazo de la línea:echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'.Ese código funciona para mí con todas las versiones de bash que probé entre 2.05b y 4.3. Lo más probable es que haya intentado ejecutar ese script con un shell diferente que no admite la
$'...'forma de cita.Que
$'...'la sintaxis no es estándarshsintaxis (todavía) y sólo está soportado (a partir del 22/05/2015 y que yo sepa) porksh93(donde se originó),zsh,bash, las versiones recientes demkshy lossho las últimas versiones de FreeBSD .Mi apuesta sería la que ha intentado ejecutar esa secuencia de comandos con el
shlugar debashy tushse basa en versiones deash,pdksh,yashoksh88que no soportan todavía.Si desea que el código POSIX 2008 sea compatible, deberá escribirlo:
Luego, puede hacer que lo interprete cualquier shell compatible con POSIX
basho cualquiera más ágil / rápido como el suyosh.(y recuerde que dejar una variable sin comillas en el contexto de la lista tiene un significado muy especial en los shells tipo Bourne).
fuente
Esto funciona para mi:
Y también funciona para líneas en blanco:
fuente
readuna vez en una variable simple (en lugar de unareadarrayindexación positiva).Con Bash incorporado
ready here-string:Usando la expansión de parámetros POSIX:
fuente