自动重写带有正确引用的bash脚本的工具?

自动重写带有正确引用的bash脚本的工具?,bash,static-analysis,quoting,Bash,Static Analysis,Quoting,我正在考虑让大型代码库的所有bash脚本都兼容,但这项任务是艰巨的,因为太多的开发人员在历史上忽略了所有shell脚本中的第一条规则: 如果有一个工具至少可以修复引用,那将是很有帮助的。然后我就可以用手把其余的修好了。我的正则表达式没有截断它,因为只有字符串中没有的变量必须被引用 样本输入: echo "Removing $a ${b} $(c $(c)) `d $d` ${10} $@ now" rm -rf $a ${b} $(c $(c)) `d $d` ${10} $@ 样本输出: e

我正在考虑让大型代码库的所有bash脚本都兼容,但这项任务是艰巨的,因为太多的开发人员在历史上忽略了所有shell脚本中的第一条规则:

如果有一个工具至少可以修复引用,那将是很有帮助的。然后我就可以用手把其余的修好了。我的正则表达式没有截断它,因为只有字符串中没有的变量必须被引用

样本输入:

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”,除非前面或后面紧跟一个引号,但无法检测我们是否在字符串中更深。

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

你可以看到

示例:

$ 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}" "$@"
$cat script.sh
echo“立即删除$a${b}$(c$(c)`d$d`${10}$@now”
rm-rf$a${b}$(c$(c))`d$d`${10}$@
$checkshellvar
免责声明:该程序实现了您的示例输出,但我是在休息时间完成的,所以不要期望太多;-)


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

WPomier比我快,但我也做了自己的事(因为我想):


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

“我的正则表达式没有剪切它。”您能说明您尝试了什么以及失败的原因吗?顺便说一句,这是一项崇高的努力。我对解决方案感兴趣。您基本上需要一个
bash
解析器来确定引用了哪些参数扩展,哪些没有引用。正则表达式对于这样的解析是不够的,你不仅需要一个shell语言的解析器,而且这个解析器还需要有魔力。只有这样,它才能判断哪些变量引用应该被引用,因为在某些情况下,一个变量引用可以扩展到多个shell字。引用这样一个变量引用可能会打破这一点。在某些情况下,我一生中可能只遇到过一次这样的情况。我们有代码审查,所以不要担心;-)@WalterA,这些也需要修复,但是使用
files=(abc);触摸--“${files[@]}”;rm-f--“${files[@]}”
。其中一种情况是代码复查,因为它不能真正自动化。第一次提交有点粗糙:-(我告诉过你我是在厨房里做的:-)为了调试它,我对一个参数(文件名)添加了支持。我测试了很多我自己的脚本,现在看起来运行良好。这正是我所要求的。不是十全十美的,但与适当的盐粒搭配很有用。您提到不支持herdoc,所以我将手动处理这些文件。