Ubuntu 22.04.1 LTS中bash脚本调用时字符串替换命令报错的解决需求
Ubuntu 22.04.1 LTS中bash脚本调用时字符串替换命令报错的解决需求
我来帮你分析这个问题并给出对应的解决方案:
问题根源
你碰到的Bad substitution错误,核心原因是调用脚本的解释器不匹配:
- 你的
script2.sh开头指定了#!/bin/bash,所以直接运行./script2.sh时,系统会用bash来执行,而bash支持${变量/旧字符串/新字符串}这种扩展的字符串替换语法。 - 但在
script1.sh里你用了sh script2.sh来调用,而Ubuntu 22.04默认sh指向的是dash(一个轻量级的POSIX兼容shell,不支持bash的扩展语法),dash无法识别这种替换写法,所以抛出了错误。
解决方案
有几种简单的办法可以解决这个问题:
- 用bash直接调用script2.sh
把script1.sh里的sh script2.sh改成:
bash script2.sh
这样就会用bash来执行script2.sh,和你直接运行它的环境一致,字符串替换就能正常工作了。
- 给script2.sh添加可执行权限后直接调用
先给script2.sh加上可执行权限:
chmod +x script2.sh
然后在script1.sh里把调用语句改成:
./script2.sh
这时候系统会读取script2.sh开头的#!/bin/bash指定,自动用bash执行脚本,同样能避免语法兼容问题。
- (针对你后续传参数的需求)传递参数并在script2.sh中接收
如果后续要把script1.sh里的SrcRoot和DestRoot传给script2.sh,可以这样修改:
- 在script1.sh里的调用语句改成:
bash script2.sh "$SrcRoot" "$DestRoot"
- 在script2.sh里接收参数并赋值:
LSrcRoot="$1" LDestRoot="$2" # 保留原来的LSrcFullSpec生成逻辑
这样既解决了执行环境的问题,也实现了参数传递的需求。
验证效果
修改后再运行./script1.sh,你会发现script2.sh里的字符串替换命令能正常执行,不会再出现Bad substitution错误了。
备注:内容来源于stack exchange,提问作者SkiBum
相关产品推荐
相关产品推荐

