Speichern Sie 2 ^ 500 in einer Variablen in bash

7

Ich möchte den Wert 2 ^ 500 in der Variablen speichern DELTA.

Ich mache

export DELTA=$(echo "scale=2; 2^500" | bc)

aber das setzt nicht DELTAauf 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376. Stattdessen wird es auf gesetzt

32733906078961418700131896968275991522166420460430647894832913680961\
33796404674554883270092325904157150886684127560071009217256545885393\
053328527589376

Ich habe die Antworten in dieser Frage (3 Jahre alt) mit ausprobiert

export DELTA=$(echo "scale=2; 2^500" | bc | tr '\n' ' ') 

oder

export DELTA=$(echo "scale=2; print 2^500" | bc | tr '\n' ' ')

aber keiner von ihnen arbeitet zum Setzen der Variablen, nur um sie wiederzugeben. Irgendeine Idee?

Jorge Leitao
quelle
Versuchen Sie eine Einstellung BC_LINE_LENGTHwie Stephane in dieser Antwort: unix.stackexchange.com/a/176966/70524
Muru
5
Sie haben bereits die Antwort (en) erhalten. Ich möchte nur hinzufügen, dass Sie keinen echoBefehl benötigen . Verwenden Sie stattdessen Here String Redirection:bc <<< "scale=2; 2^500"
jimmij
@jimmij Eine Sache; Der echoWeg ist viel portabler (denken Sie an kommerzielle * Nixe). Darüber hinaus müssen Sie sicherstellen , dass /tmpheißt beschreibbar , wenn Sie hier Strings verwenden. Denken Sie an Notfallkonsolen mit /montiertem Ro - Ihr hierer String-Ansatz schlägt fehl.
Syntaxfehler

Antworten:

12
echo "scale=2; 2^500" | bc | tr -d '\n\\'

Ausgabe:

3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
Cyrus
quelle
1
Ich dachte, dass tr nur mit einem Zeichen gleichzeitig funktioniert? oO
Gilles Quenot
@StardustOne Nicht wirklich. Sie können beliebige Gruppen von Zeichen mit den beiden Parametern verwenden, z. B. try echo "havk vf sha" | tr 'fhaskv' 'sunfxi':) (dies ist rot13 für den armen Mann, wobei die Zeichen absichtlich unsortiert sind, um die Lösung nicht zu früh
preiszugeben
14

In der GNU-Implementierung von bcgibt es die Umgebungsvariable BC_LINE_LENGTH(vgl. man bc):

~$ echo "scale=2; 2^500" | bc
32733906078961418700131896968275991522166420460430647894832913680961\
33796404674554883270092325904157150886684127560071009217256545885393\
053328527589376
~$ export BC_LINE_LENGTH=99999 #or better 0
~$ echo "scale=2; 2^500" | bc
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
Fredtantini
quelle
1
Diese Lösung gefällt mir am besten, außer dass BC_LINE_LENGTH=0sie auf meinem Computer (Mac OS X) nicht funktioniert und ich sehr große Zahlen verwende. Daher BC_LINE_LENGTHreicht es mir nicht , sie je nach Anzahl zu ändern . +1 auf jeden Fall.
Jorge Leitao
3

In andere Richtungen denken:

export DELTA=$(python -c 'print(2**500)')
Orion
quelle
2
> echo "scale=2; 2^500" | bc | { read value; echo "$value";}
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
Hauke ​​Laging
quelle
1
$ echo "scale=2; 2^500" | bc | perl -pe 's/\\\n//'
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
Gilles Quenot
quelle