risposta-alla-domanda-sullo-sviluppo-web-bd.com

Aggiunta di caratteri di nuova riga per unire le variabili Shell

Sono nuovo dello scripting di Shell. Ho una variabile in uno script di shell in cui mi piacerebbe formattare i dati. La variabile memorizza nuovi dati durante ogni iterazione di un ciclo. Ogni volta che i nuovi dati vengono archiviati, vorrei inserire un nuovo carattere di linea. Ecco come sto cercando di memorizzare i dati nella variabile.

VARIABLE="$VARIABLE '\n' SomeData"

Sfortunatamente, l'output include il letterale '\n' Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.

30
James P.

Prova $'\n':

VAR=a
VAR="$VAR"$'\n'b
echo "$VAR"

mi da

a
b
55
vmpstr

Una tecnica comune è:

nl='
'
VARIABLE="PreviousData"
VARIABLE="$VARIABLE${nl}SomeData"

echo "$VARIABLE"
PreviousData
SomeData
20
William Pursell
VAR="one"
VAR="$VAR.\n.two"
echo -e $VAR

Produzione:

uno. 
.Due

5
Alex

Oltre a $'\n' puoi usare printf anche in questo modo:

VARIABLE="Foo Bar"
VARIABLE=$(printf "${VARIABLE}\nSomeData")
echo "$VARIABLE"

PRODUZIONE:

Foo Bar
SomeData
3
anubhava

È molto più semplice di quanto pensi:

VARIABLE="$VARIABLE
SomeData"
1
chepner

Citazione singola Tutti i caratteri speciali tra queste virgolette perdono il loro significato speciale.
https://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

Quindi la sintassi che usi fa qualcosa di diverso che vuoi raggiungere.

Questo è quello di cui hai bisogno:

Il costrutto $ '\ X' rende l'opzione -e in echo inutile . 
https://linux.die.net/abs-guide/escapingsection.html

echo -e "something\nsomething"

echo "something"$'\n'"something"
1
user8175891

Ho avuto un problema con tutte le altre soluzioni: quando usavo un # seguito da SPACE (abbastanza comune quando scrivevo in Markdown) entrambi venivano divisi in una nuova riga.

Quindi, un altro modo per farlo coinvolgerebbe le virgolette singole in modo che "\ n" venga visualizzato.

FOO=$'# Markdown Title #\n'
BAR=$'Be *brave* and **bold**.'
FOOBAR="$FOO$BAR"

echo "$FOOBAR"

Produzione:

# Markdown Title #
Be *brave* and **bold**.
1
pattulus

Basandomi sulle prime due soluzioni, farei come mostrato di seguito. Concatenare le stringhe con l'operatore '+ =', in qualche modo mi sembra più chiaro.

Ricorda anche di usare printf anziché eco, ti risparmierai così tanti problemi

sometext="This is the first line"
sometext+=$'\n\n'
sometext+="This is the second line AFTER the inserted new lines"
printf '%s' "${sometext}"

Uscite:

Questa è la prima linea

Questa è la terza riga DOPO la nuova riga inserita

0
Almendrico