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í.