漂亮打印Shell脚本

15
我正在寻找类似于 indent 的东西,但适用于 (bash) 脚本。只能在控制台中使用,不能有着色等功能。
你知道有类似的工具吗?

还要考虑将您的答案放在这个更一般的问题中。 - Benoit
我写了一个脚本,可以完成同样的功能。这里有一个演示:https://ray.run/tools/bash-command-formatter - undefined
4个回答

7
Vim可以缩进bash脚本。但是在缩进之前不会重新格式化它们。
备份你的bash脚本,用vim打开它,输入gg=GZZ,缩进将被纠正。(注意:这会覆盖文件,所以一定要备份!)

然而,一些问题可能会出现<<(期望EOF作为第一个字符在一行上)例如

编辑:应为ZZ而非ZQ。


使用 cp -p $script{,.$(date -Is)} 进行备份,可以得到一个文件,可以使用 diff -cw 进行比较,从而证明这个解决方案对我测试过的一个相当复杂的 shell 脚本非常有效。(没有 << 的文本) - Andrew Beals

3

bash5+有一个--pretty-print选项。它可以删除注释,包括第一行的“#!/bin...”


3

在bash中,我这样做:

reindent() {
source <(echo "Zibri () {";cat "$1"; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3 | sed -e "s/^\s\s\s\s//"
}

这将以“Bash方式”删除注释并重新缩进脚本。

如果您的脚本中有HEREDOCS,则会被前一个函数中的sed破坏。

因此,请使用:

reindent() {
source <(echo "Zibri () {";cat "$1"; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3"
}

但是你的脚本必须缩进4个空格。
或者你可以这样做:
reindent () 
{ 
    rstr=$(mktemp -u "XXXXXXXXXX");
    source <(echo "Zibri () {";cat "$1"|sed -e "s/^\s\s\s\s/$rstr/"; echo "}");
    echo '#!/bin/bash';
    declare -f Zibri | head --lines=-1 | tail --lines=+3 | sed -e "s/^\s\s\s\s//;s/$rstr/    /"
}

which还可以处理heredocs。


1
有些 tr 实现不喜欢直接使用 urandom... cat /dev/urandom | base64 可以很好地替代它.. 谢谢 - Brian Chrisman
最后一个对我不起作用,终端提示错误。此外,空行也会被忽略。 - Stéphane Gourichon
返回翻译后的文本:是的,空行会丢失...但可以进行修改...我不需要它。 - Zibri
你可以在“tr“命令前后再加上“tr“命令,将两个换行符替换为“ZZ”,然后再将“ZZ”替换为两个换行符(但是有很多种方法)。 - Zibri
@BrianChrisman 或者你可以只输入一个静态随机字符串... 它只是不能出现在代码中... 我使用了一个随机的字符串,这样重新缩进就可以自我缩进 :D - Zibri

1

shfmt 很好用。

你可以格式化bash脚本,也可以通过pre-commit钩子检查格式。

# reformat
shfmt -l -w script.sh

# check if the formatting is OK
shfmt -d script.sh

# works on the whole directory as well
shfmt -l -w .

唯一缺少的选项是它不能根据行长度重新格式化(但是)。
由于它是用 Go 编写的,您可以为大多数平台下载二进制文件,例如 Travis(.travis.yml):
install:
  - curl -LsS -o ~/shfmt https://github.com/mvdan/sh/releases/download/v3.1.2/shfmt_v3.1.2_linux_amd64
  - chmod +x ~/shfmt
script:
  - ~/shfmt -d .

在npm上也有一个交叉编译的js版本,以及许多编辑器插件(请参见相关项目


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接