使用适当的引用自动重写 bash 脚本的工具?

Tool to automatically rewrite a bash script with proper quoting?

我正在考虑制作大型代码库的所有 bash 脚本 shellcheck compliant, but the task is overwhelming, because too many developers have historically ignored rule number one of all shell scripting: always use quotes

如果有一个至少可以修复引用的工具会很有帮助。然后我就可以手动修复其余部分了。我的正则表达式没有削减它,因为只有 not 已经在字符串中的变量必须被引用。

示例输入:

echo "Removing $a ${b} $(c $(c)) `d $d`  $@ now"
rm -rf $a ${b} $(c $(c)) `d $d`  $@

示例输出:

echo "Removing $a $b $(c "$(c)") `d "$d"`  $@ now"
rm -rf "$a" "$b" "$(c "$(c)")" "$(d "$d")" "" "$@"

它不必解决以上所有问题,甚至不必完美无缺(尽管那真的很好),但它必须经常正确而不是有用。


这是我天真的正则表达式,但没有成功:

s:([^"])$\{([_A-Za-z0-9]+)\}([^"]|$):"$":g

它将 ${identifier} 转换为“$identifier”,除非紧接在引号之前或之后,但无法检测我们是否在字符串中更深。

这不是一个现成的工具,而是一个 C 语言的小程序,它可以帮助您作为获得所需内容的基础。

可以看到here.

示例:

$ cat script.sh
echo "Removing $a ${b} $(c $(c)) `d $d`  $@ now"
rm -rf $a ${b} $(c $(c)) `d $d`  $@

$ checkshellvar < script.sh
echo "Removing $a ${b} $(c $(c)) `d $d`  $@ now"
rm -rf "$a" "${b}" "$(c "$(c)")" "$(d "$d")" "" "$@"

免责声明:该程序实现了您的示例输出,但我是在喝咖啡休息时间做的,所以不要期望太高;-)

注意:尽管有这个程序,我完全相信shell脚本中的引号是有意义的,它们的缺失或使用单引号或双引号是视情况而定完全有效。

WPomier 先于我,但我自己也做了(因为我想):
https://github.com/anordal/shellharden

它充当语法高亮器,直到您给它 --transform 选项。