You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法识别这种替换写法,所以抛出了错误。

解决方案

有几种简单的办法可以解决这个问题:

  1. 用bash直接调用script2.sh
    把script1.sh里的sh script2.sh改成:
bash script2.sh

这样就会用bash来执行script2.sh,和你直接运行它的环境一致,字符串替换就能正常工作了。

  1. 给script2.sh添加可执行权限后直接调用
    先给script2.sh加上可执行权限:
chmod +x script2.sh

然后在script1.sh里把调用语句改成:

./script2.sh

这时候系统会读取script2.sh开头的#!/bin/bash指定,自动用bash执行脚本,同样能避免语法兼容问题。

  1. (针对你后续传参数的需求)传递参数并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:57:47