GNU/Linux >> Linux Esercitazione >  >> Linux

Le stringhe mancano dopo aver concatenato due o più stringhe variabili in Bash?

Quando eseguo due cicli while e provo a concatenare due stringhe variabili (da due cicli), l'output finale (stringa) è strano. Ho provato un modo diverso per concatenare ma non ho ottenuto la risposta:Di seguito è riportato il codice:
[I need 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

In varlists.txt

var1
var2

In model_test1.txt

My_model1
My_model2

Dopo aver eseguito lo script, viene visualizzato

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

Risposta accettata:

I tuoi file di testo hanno terminazioni di riga CRLF di Windows/DOS.

Le stringhe si concatenano correttamente, ma il byte di ritorno a capo viene lasciato alla fine di vname e mname , perché non fa parte di una riga che termina su Unix e quindi non è stato utilizzato da read . Quando stampi la stringa, il display è invece maciullato. I ritorni a capo riportano il cursore all'inizio della riga (come una macchina da scrivere), lasciando che il testo venga sovrascritto.

Quando si stampa del testo con un ritorno a capo, il testo fino al CR viene visualizzato normalmente, quindi il cursore di output torna all'inizio e quindi le parti successive della stringa vengono stampate sopra le parti precedenti. Ecco perché "*.nc ” appare all'inizio della riga nell'output segnalato anche se “${extn} ” è l'ultimo – mname termina con un ritorno a capo.

Puoi eseguire i tuoi file di testo tramite dos2unix per rimuovere i byte di ritorno a capo extra. Puoi anche usare ${vname%$'r'} nello script per troncare i CR finali se non vuoi o non puoi modificare i file.


Linux
  1. Continuazioni della linea Bash dopo &&e || Documentato?

  2. Ripeti il ​​testo dopo il comando arricciatura sulla stessa riga?

  3. In Bash, come aggiungo una stringa dopo ogni riga in un file?

  4. Come confrontare due stringhe nel formato della versione separata da punti in Bash?

  5. Abbina due stringhe in una riga con grep

Utilizzo di più per visualizzare i file di testo dalla riga di comando di Linux

Bash concatena le stringhe

Come usare bash if -z e if -n per testare le stringhe in Linux

Script di Bash per centrare Fortune/testo da Stdin/pipe?

lo script bash aggiunge il testo alla prima riga di un file

Come leggere l'ultima riga di un file di testo in una variabile usando Bash?