/ / Ako môžem vynútiť chybu syntaxe v aritmetickom vyjadrení, aby som zrušil môj Bash skript? - bash

Ako môžem vynútiť chybu syntaxe v aritmetickom vyjadrení, aby som zrušil môj Bash skript? - bash

Nedávno som mal problém v jednom z mojich basovskripty, ktoré boli spôsobené neočakávaným výstupom z jedného zo spúšťaných príkazov SSH (kvôli aktualizácii verzie operačného systému). Problém skutočne vyústil do chyby syntaxe Bash, pretože som očakával, že tento výstup bude obsahovať iba číselný kód stavu (zo vzdialeného skriptu), ktorý som potom použil v aritmetickom vyjadrení.

Čo ma však prekvapilo bolo to, že môj Bash skript pokračoval v vykonávaní po hlásení syntaktickej chyby. Toto napriek tomu, že v blízkosti začiatku súboru mám nasledujúci riadok:

# Terminate script if any command fails
set -o errexit

Napriek tomu, že chyba syntaxe samozrejme nie je rovnaká ako nesprávny príkaz, zdá sa mi, že prvý predstavuje ešte závažnejšiu chybu.

Viem, že môžete použiť parameter -n na skontrolovanie syntaxe skriptu Bash bez toho, aby ste v skutočnosti vykonávali nejaké príkazy, ale tento problém by sa takýmto problémom nepodarilo.

Tu je príklad, ktorý spôsobuje chybu, ale nekončí:

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

Existuje nejaký spôsob, ako vynútiť vypnutie skriptu Bash hneď po zistení syntaktickej chyby v aritmetickom vyjadrení počas normálnej prevádzky?

odpovede:

0 pre odpoveď č. 1

Rýchla odpoveď je, že ju môžete v tomto prípade zachytiť skúmaním $?:

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

Tento prístup však vždy nefunguje, napr.

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

bude mať za následok:

caught syntax error; aborting

Na bash(1) manuálové stránky hovorí:

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.

ale to skrýva niektoré podrobnosti Bash "s pomerne zvláštne správanie vo vzťahu k syntaktické chyby.Napríklad,

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

Výsledky:

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

mimochodom set -o errexit Copak "t zdá mať nejaký vplyv na toto.