【发布时间】:2016-04-25 14:42:58
【问题描述】:
我们开始使用shellcheck 来检查我们的脚本是否有错误/警告,
现在我们在所有脚本中看到的常见警告是未引用的变量。
是否有任何脚本可以纠正这些简单的警告/错误?
我有以下命令,用于将 $VAR 更改为 ${VAR}
sed -i -r 's:\$([_a-zA-Z?][_a-zA-Z0-9]*):${\1}:g' <scriptname>
我修改如下,sed -i -r 's:\$([_a-zA-Z?][_a-zA-Z0-9]*):"${\1}":g' <scriptname>
当变量没有被引用但被引用时,上面的命令可以正常工作,例如"$VAR" 变为 ""${VAR}""
关于是否继续使用sed 或更好地编写脚本来做的任何建议?
有什么特别的建议吗?
【问题讨论】:
-
检查是否已经有引号。
's/"*yadda"*/"yadda"/' -
引用变量是一个基本的,有用的东西要记住。如果您忘记了它而仅仅依靠一个小脚本来执行它,那么您将面临风险:脚本失败的风险并且您认为其他事情可能是错误的,忘记引用变量这一原则而不考虑的风险。这就像编写一个系好安全带的脚本:我认为当你在飞机上坐下时记住这样做会更好。
-
@fedorqui 问题是当我们开始工作时,我们都是新手,在此期间我们有所改进,但现在我们有许多脚本需要修改,我们会审查它们,但更改每一行有点无聊,所以考虑使用脚本来做到这一点。
-
我有一个大致相当于你的脚本,但它不会尝试添加双引号,因为没有简单的方法来确保它被正确处理。如果您使用
vim(或vi),您可以相对轻松地创建一个缩写,在必要时添加双引号(在您已经运行$a到${a}转换器之后。例如::map v /${[^}]*}/^V^Mi"^VESCll%a"^VESC(其中 ^V、^M 是 control-V 和 control-M,而 ESC 是转义键)。或者您可能更愿意将搜索与替换操作分开——这有其优点。