Puncte:5

Operatorul de creștere nu funcționează pe o variabilă dacă variabila este setată la 0

drapel br

Creșterea unei variabile var funcționează în bash când este închis între paranteze duble, cum ar fi (( var++ )). Dar am descoperit că eșuează dacă variabila este setată la 0 în prealabil, cum ar fi var=0.

$ a=0
$ ((a++)) && echo „comanda a reușit” || echo "comanda a eșuat"
comanda a eșuat

$ a=1
$ ((a++)) && echo „comanda a reușit” || echo "comanda a eșuat"
comanda a reușit

Poate cineva să explice acest comportament?

Mediu inconjurator:

Folosesc gnome-terminal pe Ubuntu Desktop 18.04.5 LTS.

pLumo avatar
drapel in
Cred că nu ar trebui să vedeți starea de ieșire a lui `((` pentru a ști dacă comanda funcționa.. *>> "Dacă rezultatul expresiei este 0, codul de stare de ieșire returnat va fi 1 sau âfalsâ , în timp ce codul de stare de ieșire returnat de o expresie cu valoare diferită de zero va fi 0 sau âtrueâ."* ([via](https://developpaper.com/functions-of-in-linux- coajă-2))
wjandrea avatar
drapel cn
Notă secundară: există mai multe moduri de a [incrementa o variabilă în Bash](/q/385528/301745). Probabil cel mai idiomatic este să îl transformi în mod explicit într-un număr întreg mai întâi: `declare -i a=0` apoi `a+=1`.
ilkkachu avatar
drapel co
@pLumo, nu starea de ieșire este greșită, ci presupunerile utilizatorilor (și ale tale). Funcționează exact așa cum este definit post-increment și exact așa cum funcționează în, de ex. C. Deși ai dreptate în faptul că nu poți folosi starea de ieșire a lui `(( .. ))` pentru a vedea dacă _a funcționat_, deoarece o eroare de sintaxă îl face să iasă și cu starea 1. (și nu, de exemplu, 2, ca `[` și `[[` fac)
Saad Abdul Majid avatar
drapel br
@pLumo, codul de stare de ieșire mă preocupă pentru că scriptul folosește `capcană... ERR` și această linie provoacă. Am evitat acest scenariu, deocamdată, folosind pre-increment, deoarece valoarea mea de bază este 0 pentru `var`. Dar această soluție este specifică cazului meu de utilizare. Poate ar trebui să caut o modalitate de a ocoli „capcana” pentru astfel de declarații/selectate.
Puncte:10
drapel cn

Cu credit de aici: https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

Valoarea returnată a lui (( expresie )) nu indică o stare de eroare, dar, din pagina de manual bash:

((expresie)) Expresia este evaluată conform regulilor descrise mai jos la EVALUARE ARITMETICĂ. Dacă valoarea expresiei este diferit de zero, starea de returnare este 0; în caz contrar, starea de returnare este 1. Acest lucru este exact echivalent cu „expresie”.

În ((a++))faci o creștere de postare. Valoarea a A este 0 asa de 1 este returnat, după aceea, este incrementat.

Comparaţie

$ dezactivat a
$ ((a++)) ; echo Exitcode: $? a: $a
Cod de ieșire: 1 a: 1

contra

$ dezactivat a
$ ((++a)) ; echo Exitcode: $? a: $a
Cod de ieșire: 0 a: 1

Un pre-increment, deci A a devenit 1 și 0 este returnat.

wizzwizz4 avatar
drapel de
Din punct de vedere tehnic, creșterea are loc înainte de întoarcere; cu toate acestea, valoarea returnată este valoarea luată înainte de increment.
Puncte:5
drapel jp

Acest lucru funcționează pentru mine (în bash în Ubuntu),

$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4

Observați diferența cu

$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3
pLumo avatar
drapel in
verificați `echo $?`.
sudodus avatar
drapel jp
@pLumo, echo $((a++)) se tipărește înainte de actualizare, echo $((++a)) se tipărește după actualizare.
bac0n avatar
drapel cn
Expansiunea aritmetică nu emite o stare de ieșire nu vede conexiunea?

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.