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

时间:2016-12-12 15:27:06

标签: bash static-analysis quoting

我正在考虑使所有大型代码库shellcheck的bash脚本兼容,但任务非常繁琐,因为过多的开发人员历来忽略了所有shell脚本中的第一个规则:always use quotes

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

示例输入:

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

示例输出:

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

它不需要修复上述所有内容,它甚至不必完美无瑕(虽然这会非常好),但它必须是正确的,而不是没有用。

这是我天真的正则表达式并没有削减它:

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

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

2 个答案:

答案 0 :(得分:8)

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

它充当语法高亮显示器,直到您为其提供auth选项。

答案 1 :(得分:4)

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

你可以看到它here

示例:

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

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

免责声明:该计划实现了您的样本输出,但我在休息时间做了这个,所以不要期望太多; - )

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