Puncte:2

Evaluați șirul ```$((expresie))```-like și salvați într-o variabilă

drapel in

Acest lucru va suna destul de ciudat pentru unii dintre voi. Să presupunem că am un șir care reprezintă unele $((expresie)), expresie aritmetică matematică ca '$((1+1))'. Doresc să o efectuez și să-i transmit rezultatul unei variabile.

Exemplu:

$ expresie='$((5+5))'
$ echo $expresie 
„$((5+5))”

$ # Rezultat așteptat: 10

Cum pot evalua acel șir și să-i stochez rezultatul?

Bruno Henrique Peixoto avatar
drapel in
Oh, s-ar putea să gătesc o pastă grozavă cu toate acele greșeli macarronice, mulțumesc!
Puncte:1
drapel jp

Dacă evaluezi un șir, încearcă eval.

str="$[ 5 + 5 ]"
eval "numb=$str" # Se transformă în `numb=$[ 5 + 5 ]`
echo $numb # Iese 10

eval poate executa șiruri de caractere ca și cum ar fi cod shell. Ai grija! Dacă $str poate conține caractere speciale, vă poate rupe scriptul sau chiar crea o gaură de securitate.

Puncte:0
drapel sd

Păstrați-l în variabilă așa cum ați face în mod normal.

rezultat $=$((5+5))
$ echo $rezultat 
10

Dacă nu asta ai vrut să spui, Editați | × postarea dvs. și postați informații suplimentare.

Bruno Henrique Peixoto avatar
drapel in
Am actualizat întrebarea pentru a înțelege mai bine cazul meu. Dar apreciez răspunsurile de până acum! :-)
drapel jp
Dan
@BrunoHenriquePeixoto În editarea dvs., ați folosit aproape același cod. Acest răspuns este exact ceea ce doriți în acest caz. Singura eroare pe care o aveți este că folosiți ghilimele din partea `$((5+5))`, trebuie să eliminați asta.
Bruno Henrique Peixoto avatar
drapel in
Ei bine, operația pe care trebuie să o evaluez are ghilimele. Atunci, mi-e teamă că nu le pot evalua.
Puncte:0
drapel cn

Dacă este de fapt matematic, mai ales dacă implică aritmetică simplă de întregi, puteți folosi exact formatul pe care îl aveți:

$ var=$((1+1))
$ echo „$var”
2

Același lucru este valabil și dacă este o comandă. De exemplu, matematică puțin mai complicată poate fi făcută prin conducte către bc:

## matematica cu numere întregi simple funcționează
$ echo $((3 * 2))
6
## fracții eșuează
$ echo $((1,3 * 2))
bash: 1.3 * 2: eroare de sintaxă: operator aritmetic nevalid (indicativul de eroare este ".3 * 2")
## bc funcționează
$ echo „1,3 * 2” | bc
2.6

Deci, pentru a stoca asta într-o variabilă, utilizați doar standard înlocuirea comenzii:

$ var=$(echo „1,3 * 2” | bc)
$ echo „$var”
2.6

În sfârșit, aveți și dvs eval încorporat (vezi ajuta eval în bash):

$ ajutor eval
eval: eval [arg ...]
    Executați argumente ca o comandă shell.
    
    Combinați ARG-urile într-un singur șir, utilizați rezultatul ca intrare în shell,
    și executați comenzile rezultate.
    
    Stare de ieșire:
    Returnează starea de ieșire a comenzii sau succes dacă comanda este nulă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.