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
Antwoord
Deze syntaxis werkt voor mij:
a=$((b + c))
(( A = $C - $D ))
?