Gibt es eine Möglichkeit zu überprüfen, ob ein Bash-Skript vollständig ist oder nicht?

Ich versuche, ein zu implementierenREPL (Read-Eval-Print-Schleife) in bash. Wenn so etwas schon existiert, ignoriere bitte das Folgende und beantworte diese Frage mit einem Zeiger darauf.

Verwenden wir dieses Skript als Beispiel (nennen wir estest.sh):

if true
then
  echo a
else
  echo b
fi
echo c

Ich möchte dieses Skript Zeile für Zeile lesen und prüfen, ob das, was ich bisher gelesen habe, ein vollständiger Bash-Ausdruck ist. wenn es vollständig ist,eval es; Ansonsten lesen Sie die nächste Zeile weiter. Das folgende Skript veranschaulicht meine Idee hoffentlich (es funktioniert jedoch nicht ganz).

x=""
while read -r line
do
  x=$xMotivation

Für ein Bash-Skript möchte ich es in syntaktisch vollständige Ausdrücke zerlegen, jeden Ausdruck auswerten, die Ausgabe erfassen und schließlich den Quellcode und die Ausgabe markieren (z. B. mit Markdown / HTML / LaTeX / ...). Zum Beispiel für ein Skript

echo a
echo b

Was ich erreichen möchte, ist die Ausgabe wie folgt:

```bash
echo a
```

```
a
```

```bash
echo b
```

```
b
```

anstatt das gesamte Skript auszuwerten und die gesamte Ausgabe zu erfassen:

```bash
echo a
echo b
```

```
a
b
```
\n'$line # concatenate by \n # the line below is certainly a bad way to go if eval $x 2>/dev/null; then eval $x # code seems to be working, so eval it x="" # empty x, and start collecting code again else echo 'incomplete expression' fi done < test.sh
Motivation

Für ein Bash-Skript möchte ich es in syntaktisch vollständige Ausdrücke zerlegen, jeden Ausdruck auswerten, die Ausgabe erfassen und schließlich den Quellcode und die Ausgabe markieren (z. B. mit Markdown / HTML / LaTeX / ...). Zum Beispiel für ein Skript

echo a
echo b

Was ich erreichen möchte, ist die Ausgabe wie folgt:

```bash
echo a
```

```
a
```

```bash
echo b
```

```
b
```

anstatt das gesamte Skript auszuwerten und die gesamte Ausgabe zu erfassen:

```bash
echo a
echo b
```

```
a
b
```

Antworten auf die Frage(4)

Ihre Antwort auf die Frage