GNU/Linux >> Znalost Linux >  >> Linux

Automatická transformace nových řádků v Shell proměnné přiřazení?

Vyplynulo to z jednoho z mých komentářů k této otázce týkající se použití bc ve skriptování shellu. bc zalomí řádky ve velkých číslech, např.:

> num=$(echo 6^6^3 | bc)
> echo $num
12041208676482351082020900568572834033367326934574532243581212211450\ 20555710636789704085475234591191603986789604949502079328192358826561\ 895781636115334656050057189523456

Všimněte si však, že se v proměnné ve skutečnosti nejedná o zalomení řádků – nebo alespoň ne, pokud je použita bez uvozovek. Například v dovádění s více trubkami v zadání, např.:

num=$(echo 6^6^3 | bc | perl -pne 's/\\\n//g')

Uvědomil jsem si, že zatímco ve skutečnosti existuje \n v bc výstup, zaškrtnutím echo $num > tmp.txt s hexdump zobrazuje \n (ASCII 10) se definitivně stala mezerou (ASCII 32) v přiřazení proměnné.

Nebo alespoň ve výstupu neuvedeného $num > . Proč?

Jak zdůrazňuje fedorqui, pokud používáte uvozovky:echo "$num" , znovu získáte nové řádky. To je zřejmé z prozkoumání rozdílu mezi echo $num > tmp.1 a echo "$num" > tmp.2 s hexdumpem; první obsahuje \ (mezera zpětného lomítka), zatímco pozdější obsahuje \\n (obrácené lomítko na novém řádku).

Přijatá odpověď:

echo vloží mezeru mezi každý dva argumenty. Shell bere v úvahu nový řádek v $num jen oddělovač slov (stejně jako mezera).

lines="a
b
c"
set -x
echo $lines   # several arguments to echo
echo "$lines" # one argument to echo

Viz tato odpověď (od samotného OP) pro podrobnější vysvětlení.


Linux
  1. Linux bash:Přiřazení více proměnných

  2. Číst hodnoty do proměnné shellu z kanálu

  3. Při ukládání výstupu kočky do proměnné jsou odstraněny všechny nové řádky

  1. Neočekávané chování skriptu Shell?

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. linuxový shell wc -c počet znaků +1

  1. Ukládání výstupu příkazu do proměnné Shell?

  2. Přednost logických operátorů Shell &&, ||?

  3. Skript Shell visí na příkazu Mail?