/ / Come posso forzare un errore di sintassi in un'espressione aritmetica per abortire il mio script Bash? - bash

Come posso forzare un errore di sintassi in un'espressione aritmetica per abortire il mio script Bash? - bash

Recentemente ho avuto un problema in uno dei miei Bashscript causati da un output imprevisto da uno dei comandi SSH in esecuzione (a causa di un aggiornamento della versione del sistema operativo). Il problema in realtà ha provocato un errore di sintassi di Bash, perché mi aspettavo che questo output contenga solo un codice di stato numerico (da uno script remoto), che ho poi utilizzato in un'espressione aritmetica.

Ciò che mi ha sorpreso, però, è che il mio script Bash ha continuato a essere eseguito dopo aver segnalato l'errore di sintassi. Questo, nonostante il fatto che ho la seguente riga vicino all'inizio del file:

# Terminate script if any command fails
set -o errexit

Sebbene un errore di sintassi non sia ovviamente lo stesso di un comando non riuscito, mi sembra che il primo rappresenti una condizione di errore ancora più grave.

So che è possibile utilizzare il parametro -n per verificare la sintassi di uno script Bash senza eseguire effettivamente alcun comando, ma questo non avrebbe comunque colto questo problema.

Ecco un esempio che causa l'errore ma non esce:

#!/bin/bash
set -o errexit
x=")"
echo $(( x + 1 ))
echo still running

C'è un modo per forzare uno script Bash a terminare immediatamente dopo che viene rilevato un errore di sintassi in un'espressione aritmetica durante il suo normale funzionamento?

risposte:

0 per risposta № 1

La risposta rapida è che puoi intrappolarlo in questo caso esaminando $?:

#!/bin/bash
x=")"
echo $(( $x + 1 ))
if [[ $? != 0 ]]; then
echo >&2 "caught syntax error; aborting"
exit $?
fi
echo success

Tuttavia, questo approccio non funziona sempre, ad es.

#!/bin/bash
x="-1"
(( x += 1 ))
if [[ $? != 0 ]]; then
echo >&2 "caught syntax error; aborting"
exit $?
fi
echo success

risulterà in:

caught syntax error; aborting

Il bash(1) la pagina man dice:

The evaluation is performed according to the rules listed below
under ARITHMETIC EVALUATION.  If expression is invalid, bash
prints a message indicating failure and no substitution occurs.

ma questo nasconde alcuni dettagli del comportamento abbastanza particolare di Bash rispetto agli errori di sintassi.

#!/bin/bash
x=")"
if echo $(( $x + 1 )); then
echo success
else
echo failure
fi; echo "almost end of script"
echo "end of script"

risultati in:

./foo.sh: line 3: ) + 1 : syntax error: operand expected (error token is ") + 1 ")
end of script

A proposito, set -o errexit non sembra fare alcuna differenza in tutto questo.