bash -e wordt afgesloten wanneer let of expr resulteert in 0

Ik heb een bash-script dat -e instelt, zodat het script bij elke exit-status wordt afgesloten! = 0 .

Ik probeer een aantal eenvoudige shell-rekenkundige bewerkingen uit te voeren die aan variabelen zijn toegewezen en soms is de uitdrukking gelijk aan 0, wat ervoor zorgt dat de exitstatus van het let of expr-commando “1” is.

Hier is een voorbeeld:

#!/bin/bash -ex echo "Test 1" Z=`expr 1 - 1` || true echo "Z will print" let "A=4 - 4" echo "A WILL NEVER PRINT $A" Y=`expr 1 - 1` echo "Y WILL NEVER PRINT $Y" X=$(expr 2 - 2) echo "X WILL NEVER PRINT $X" 

De output is:

$ ./test_error.sh + echo "Test 1" Test 1 ++ expr 1 - 1 + Z=0 + true + echo "Z will print" Z will print + let "A=4 - 4" 

Mijn vraag is wat de idiomatische bash scripting manier is om het script te laten falen bij echte exit-fouten en niet bij basis rekenkundige bewerkingen gelijk aan 0. Ik zou al die uitdrukkingen als suffix kunnen gebruiken met:

A=`expr $C - $D` || true 

Maar dat lijkt hacky.

Antwoord

Gebruik expr voor rekenkunde. Het is al lang achterhaald: shells hebben nu rekenkunde ingebouwd, met de $((…)) constructie (POSIX), of met let ingebouwd (ksh / bash / zsh) of de ((…)) constructie (ksh / bash / zsh).

let en ((…)) retourneer 1 (een foutstatuscode) als de laatst geëvalueerde uitdrukking 0 is. Om te voorkomen dat uw script wordt afgesloten onder set -e, moet u zorgen voor de laatste expressie om geen 0 te retourneren, bijvoorbeeld:

let "a = 2 - 2" 1 ((a = 2 - 2, 1)) 

Of gebruik het || true idioom:

((a = 2 - 2)) || true 

U kunt ook uw rekenkundige bewerkingen uitvoeren binnen $((…)) en uw opdrachten daarbuiten. Een toewijzing retourneert de status van de laatste opdrachtvervanging in de waarde, of 0 als er geen opdrachtvervanging is, dus je bent veilig. Dit heeft het extra voordeel dat je in elke POSIX-shell werkt (zoals een streepje).

a=$((2 - 2)) 

Antwoord

Ik had de hetzelfde probleem . tl; dr:

Als de laatste ARG [van let] resulteert in 0, laten we 1 retourneren; laten we anders 0 retourneren .

Antwoord

Gebruik $(( $C - $D )) in plaats daarvan voor uw rekenkunde. Het is ook efficiënter.

Opmerkingen

  • Wat maakt het efficiënter dan zeggen (( A = $C - $D ))?

Antwoord

Deze syntaxis werkt voor mij:

a=$((b + c)) 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *