使用适当的引用自动重写 bash 脚本的工具?
Tool to automatically rewrite a bash script with proper quoting?
我正在考虑制作大型代码库的所有 bash 脚本 shellcheck compliant, but the task is overwhelming, because too many developers have historically ignored rule number one of all shell scripting: always use quotes。
如果有一个至少可以修复引用的工具会很有帮助。然后我就可以手动修复其余部分了。我的正则表达式没有削减它,因为只有 not 已经在字符串中的变量必须被引用。
示例输入:
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf $a ${b} $(c $(c)) `d $d` $@
示例输出:
echo "Removing $a $b $(c "$(c)") `d "$d"` $@ now"
rm -rf "$a" "$b" "$(c "$(c)")" "$(d "$d")" "" "$@"
它不必解决以上所有问题,甚至不必完美无缺(尽管那真的很好),但它必须经常正确而不是有用。
这是我天真的正则表达式,但没有成功:
s:([^"])$\{([_A-Za-z0-9]+)\}([^"]|$):"$":g
它将 ${identifier} 转换为“$identifier”,除非紧接在引号之前或之后,但无法检测我们是否在字符串中更深。
这不是一个现成的工具,而是一个 C 语言的小程序,它可以帮助您作为获得所需内容的基础。
可以看到here.
示例:
$ cat script.sh
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf $a ${b} $(c $(c)) `d $d` $@
$ checkshellvar < script.sh
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf "$a" "${b}" "$(c "$(c)")" "$(d "$d")" "" "$@"
免责声明:该程序实现了您的示例输出,但我是在喝咖啡休息时间做的,所以不要期望太高;-)
注意:尽管有这个程序,我完全相信shell脚本中的引号是有意义的,它们的缺失或使用单引号或双引号是视情况而定完全有效。
WPomier 先于我,但我自己也做了(因为我想):
https://github.com/anordal/shellharden
它充当语法高亮器,直到您给它 --transform
选项。
我正在考虑制作大型代码库的所有 bash 脚本 shellcheck compliant, but the task is overwhelming, because too many developers have historically ignored rule number one of all shell scripting: always use quotes。
如果有一个至少可以修复引用的工具会很有帮助。然后我就可以手动修复其余部分了。我的正则表达式没有削减它,因为只有 not 已经在字符串中的变量必须被引用。
示例输入:
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf $a ${b} $(c $(c)) `d $d` $@
示例输出:
echo "Removing $a $b $(c "$(c)") `d "$d"` $@ now"
rm -rf "$a" "$b" "$(c "$(c)")" "$(d "$d")" "" "$@"
它不必解决以上所有问题,甚至不必完美无缺(尽管那真的很好),但它必须经常正确而不是有用。
这是我天真的正则表达式,但没有成功:
s:([^"])$\{([_A-Za-z0-9]+)\}([^"]|$):"$":g
它将 ${identifier} 转换为“$identifier”,除非紧接在引号之前或之后,但无法检测我们是否在字符串中更深。
这不是一个现成的工具,而是一个 C 语言的小程序,它可以帮助您作为获得所需内容的基础。
可以看到here.
示例:
$ cat script.sh
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf $a ${b} $(c $(c)) `d $d` $@
$ checkshellvar < script.sh
echo "Removing $a ${b} $(c $(c)) `d $d` $@ now"
rm -rf "$a" "${b}" "$(c "$(c)")" "$(d "$d")" "" "$@"
免责声明:该程序实现了您的示例输出,但我是在喝咖啡休息时间做的,所以不要期望太高;-)
注意:尽管有这个程序,我完全相信shell脚本中的引号是有意义的,它们的缺失或使用单引号或双引号是视情况而定完全有效。
WPomier 先于我,但我自己也做了(因为我想):
https://github.com/anordal/shellharden
它充当语法高亮器,直到您给它 --transform
选项。