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 echo
comando, 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
$STRINGTEST
no 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 queSTRINGTEST
se 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 1p
tambié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ándarsh
sintaxis (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 demksh
y lossh
o las últimas versiones de FreeBSD .Mi apuesta sería la que ha intentado ejecutar esa secuencia de comandos con el
sh
lugar debash
y tush
se basa en versiones deash
,pdksh
,yash
oksh88
que 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
bash
o 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
read
una vez en una variable simple (en lugar de unareadarray
indexación positiva).Con Bash incorporado
read
y here-string:Usando la expansión de parámetros POSIX:
fuente