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

标签 bash shell read-eval-print-loop

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

让我们以这个脚本为例(将其命名为test.sh):

if true
then
  echo a
else
  echo b
fi
echo c

我要做的是逐行阅读这个脚本,检查我目前所阅读的是否是一个完整的 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

动机

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

echo a
echo b

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

```bash
echo a
```

```
a
```

```bash
echo b
```

```
b
```

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

```bash
echo a
echo b
```

```
a
b
```

最佳答案

bash -n -c "$command_text"

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


请注意,“句法上有效”和“正确”之间有很大的差距。考虑采用类似 http://shellcheck.net/ 的东西如果您想正确解析语言。

关于bash - 有没有办法检查 bash 脚本是否完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17820740/

相关文章:

scala - 如何让我的 Scala 程序退出并返回到 REPL?

bash - 是否有 ">/dev/null 2>&1"的命令行快捷方式

linux - 在 unix/linux 命令行中定义函数(例如 BASH)

linux - Bash 脚本 : can not properly handle SIGTSTP

python - 从文件制作文件夹

tabs - 是否可以在 elm repl 中完成制表符?

linux - Bash 循环 - 为目录中的每个现有 txt 文件创建一个文件夹

linux - 递归脚本中的目录深度

python - 如何在 Python IDLE Shell 中获取终端高度(以行为单位)?

r - 以最少的输入将函数应用于 R 中的最后结果