use*_*284 9 bash static-analysis quoting
我正在考虑使大型代码库shellcheck的所有bash脚本兼容,但任务是压倒性的,因为过多的开发人员历来忽略所有shell脚本的第一个规则:始终使用引号.
如果有一个工具可以至少修复报价,那将会很有帮助.然后,我可以手动修复其余部分.我正则表达式并没有削减它,因为只有变量不是已经在一个字符串必须加引号.
样本输入:
echo "Removing $a ${b} $(c $(c)) `d $d` ${10} $@ now"
rm -rf $a ${b} $(c $(c)) `d $d` ${10} $@
Run Code Online (Sandbox Code Playgroud)
样本输出:
echo "Removing $a $b $(c "$(c)") `d "$d"` ${10} $@ now"
rm -rf "$a" "$b" "$(c "$(c)")" "$(d "$d")" "${10}" "$@"
Run Code Online (Sandbox Code Playgroud)
它不需要修复上述所有内容,它甚至不必完美无瑕(虽然这将是非常好的),但它必须是正确的,而不是没有用.
这是我天真的正则表达式没有削减它:
s:([^"])\$\{([_A-Za-z0-9]+)\}([^"]|$):\1"\$\2"\3:g
Run Code Online (Sandbox Code Playgroud)
它将$ {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}" "$@"
Run Code Online (Sandbox Code Playgroud)
免责声明:该程序实现了您的示例输出,但我在喝咖啡休息时做到了,所以不要期望太多;-)
注意:尽管有这个程序,我完全相信 shell 脚本中的引号是有意义的,根据情况,它们的缺失或使用单引号或双引号是完全有效的。