我正在考虑使所有大型代码库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”,除非紧接在引号之前或之后,但未能检测到我们是否在字符串中更深。
答案 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脚本中的引用有意义,并且根据情况,它们的缺失或使用单引号或双引号是完全有效的。