有没有办法检查bash脚本是否完整?

Yih*_*Xie 20 bash shell read-eval-print-loop

我正在尝试在bash中实现REPL(read-eval-print循环).如果这样的事情已经存在,请忽略以下内容并用指针回答这个问题.

我们以此脚本为例(命名test.sh):

if true
then
  echo a
else
  echo b
fi
echo c
Run Code Online (Sandbox Code Playgroud)

我想要做的是逐行阅读这个脚本,检查我到目前为止读的是否是一个完整的bash表达式; 如果它是完整的,eval它; 否则继续阅读下一行.下面的脚本有希望地说明了我的想法(尽管如此).

x=""
while read -r line
do
  x=$x$'\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
Run Code Online (Sandbox Code Playgroud)

动机

对于bash脚本,我想将其解析为语法上完整的表达式,计算每个表达式,捕获输出,最后标记源代码和输出(例如,使用Markdown/HTML/LaTeX/...).例如,对于脚本

echo a
echo b
Run Code Online (Sandbox Code Playgroud)

我想要实现的是这样的输出:

```bash
echo a
```

```
a
```

```bash
echo b
```

```
b
```
Run Code Online (Sandbox Code Playgroud)

而不是评估整个脚本并捕获所有输出:

```bash
echo a
echo b
```

```
a
b
```
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 6

bash -n -c "$command_text"
Run Code Online (Sandbox Code Playgroud)

...将确定您是否$command_text是一个语法上有效的脚本而不实际执行它.


请注意,"语法上有效"和"正确"之间存在巨大的空间.如果要正确解析语言,请考虑采用类似http://shellcheck.net/的内容.