GNU/Linux >> Tutoriales Linux >  >> Linux

¿Faltan cadenas después de concatenar dos o más cadenas variables en Bash?

Cuando ejecuto dos bucles while y trato de concatenar dos cadenas variables (de dos bucles), la salida final (cadena) es rara. Probé diferentes formas de concatenar pero no obtuve la respuesta:A continuación se muestra el código:
[Necesito vfile="var1_Amon_My_model1*.nc" ]

#!/bin/bash
jcount=1
extn="*.nc"
while read line
do
mname=$line
echo " Working on model - " $mname
echo " and model number = "$jcount
while read line
do
vname=$line
vfile="${vname}""_Anom_""${mname}""${extn}"
echo $vfile
done<varlists.txt
echo "******************************************"
jcount=$((jcount+1))
done<model_test1.txt

En listasvar.txt

var1
var2

En modelo_prueba1.txt

My_model1
My_model2

Después de ejecutar el script, se muestra

 Working on model -  My_model1
 and model number = 1
*.ncm_My_model1
*.ncm_My_model1
******************************************

Respuesta aceptada:

Sus archivos de texto tienen terminaciones de línea CRLF de Windows/DOS.

Las cadenas se concatenan correctamente, pero el byte de retorno de carro se deja al final de vname y mname , porque no es parte de una línea que termina en Unix y, por lo tanto, no fue utilizada por read . Cuando imprima la cadena, la pantalla está destrozado en su lugar. Los retornos de carro desplazan el cursor de vuelta al inicio de la línea (como una máquina de escribir), lo que permite que se sobrescriba el texto.

Cuando imprime algún texto con un retorno de carro, el texto hasta el CR aparece normalmente, luego el cursor de salida se mueve de regreso al inicio y luego las partes posteriores de la cadena se imprimen sobre las partes anteriores. Es por eso que el “*.nc ” aparece al comienzo de la línea en su salida informada aunque “${extn} ” es el último – mname termina con un retorno de carro.

Puede ejecutar sus archivos de texto a través de dos2unix para eliminar los bytes de retorno de carro adicionales. También podría usar ${vname%$'r'} en la secuencia de comandos para truncar los CR finales si no desea o no puede modificar los archivos.


Linux
  1. ¿Usando una referencia a una variable de cadena Bash en Sed?

  2. ¿Echo Text After Curl Command en la misma línea?

  3. En Bash, ¿cómo agrego una cadena después de cada línea en un archivo?

  4. ¿Cómo comparar dos cadenas en formato de versión separada por puntos en Bash?

  5. Une dos cadenas en una línea con grep

Uso de más para ver archivos de texto en la línea de comandos de Linux

Bash concatenar cadenas

Cómo usar bash if -z y if -n para probar cadenas en Linux

Bash Script para Center Fortune/texto de Stdin/pipe?

¿Cómo leer la última línea de un archivo de texto en una variable usando Bash?

texto de eco con nueva línea en bash