bash参数替换错误(Bad substitution):脚本执行异常求助
解决Bash脚本中"Bad substitution"错误的方法
你遇到的这个问题其实很常见——命令行里能正常跑的代码放到脚本里报错,核心原因是脚本的执行环境和命令行环境不一样。
问题根源
你用的${a//==/>=}是Bash特有的参数扩展语法(全局字符串替换),但如果你的setup.sh脚本开头用的是#!/bin/sh,在很多系统(比如Ubuntu)里/bin/sh其实是dash的软链接,而dash并不支持这种替换语法,所以就会抛出Bad substitution错误。而你在命令行里能正常执行,是因为你的交互式Shell是Bash,支持这个语法。
两种解决办法
1. 让脚本强制用Bash执行
直接修改setup.sh的第一行,把Shebang改成:
#!/bin/bash
这样系统就会调用Bash来运行整个脚本,原来的循环代码就能正常工作了。
2. 改用更通用的sed命令替换(推荐)
其实你不需要用循环逐行处理文件,用sed可以一次性完成全局替换,而且这个命令在所有POSIX兼容的Shell(包括dash)里都能正常运行,代码更简洁高效:
sed 's/==/>=/g' /opt/scanner/requirements.txt > /tmp/requirements.txt.t && mv /tmp/requirements.txt.t /opt/scanner/requirements.txt
这个命令的意思是:把requirements.txt里所有的==替换成>=,输出到临时文件,替换成功后再覆盖原文件。
内容的提问来源于stack exchange,提问作者Godzilla74
相关产品推荐
相关产品推荐

