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

Linux终端可运行代码在Bash脚本报‘bad substitution’的原因及解决

问题原因与解决方法

原因

报错的核心是执行脚本的Shell环境不支持嵌套的参数扩展语法:

  • 终端直接执行时用的是Bash,它支持${#$(命令)}这种扩展写法——先执行$()内的命令,再用${#...}获取结果字符串的长度。
  • 但代码放进脚本后,如果没在开头指定#!/bin/bash,系统会默认用/bin/sh执行。多数Linux发行版中/bin/sh指向dash(POSIX兼容Shell),而POSIX Shell仅支持${#变量名}这种基础写法,不允许在${#}里直接嵌套命令替换$(),因此触发bad substitution错误。
  • 另外,如果脚本开启了set -o posix(强制POSIX模式),即使是Bash也会禁用该扩展语法,同样会报错。

解决方法

有三种可行方案:

1. 强制脚本用Bash执行

在脚本第一行添加Bash的shebang声明,确保系统调用Bash执行脚本:

#!/bin/bash

2. 改用POSIX兼容写法

先将命令替换的结果存入变量,再获取变量长度,这种写法所有POSIX兼容Shell都能识别:

match_result=$(echo xla | egrep "^[aeiouAEIOU]")
echo ${#match_result}

3. 显式用Bash执行单行命令

如果要保留单行写法,可在脚本里显式指定用Bash执行该命令:

bash -c 'echo ${#$(echo xla | egrep "^[aeiouAEIOU]")}'

内容的提问来源于stack exchange,提问作者adamDud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:19:56