在纯 bash 中从字符串中删除重复字符-在 CLI 中有效,但在脚本中无效

在纯 bash 中从字符串中删除重复字符-在 CLI 中有效,但在脚本中无效

我想使用纯 bash(不使用 sed/awk/etc)从字符串中删除所有重复的减号。这在 CLI 中效果很好:

s="com---strig-3-1080p-----mp4"
echo "${s//+(-)/-}"

com-strig-3-1080p-mp4  # output

当我在脚本中执行相同操作时,它不起作用:

cat sanitize.sh

#!/bin/bash
s="${1?need a string}"
echo "1 $s"  # debug output

s="${s//+(-)/-}"             # convert multiple - to single -
echo "2 $s"  # debug output

现在测试:

sanitize.sh "com---strig-3-1080p-----mp4"
1 com---strig-3-1080p-----mp4
2 com---strig-3-1080p-----mp4

我究竟做错了什么?

答案1

Bash 中的的可用性+(...)通常取决于extglobshell 选项是否启用。有一些例外,例如字符串比较的右侧[[始终可以使用 extglobs,但${x/y/z}字符串替换不是这些例外之一。您需要使用以下命令启用该选项:

shopt -s extglob

您需要在脚本顶部附近执行此操作。(由于 shell 脚本在独立于交互式 shell 的进程中运行,因此它们都有自己的一组“启用选项”,并且无法从交互式 shell 继承它们……如果它们继承了这些选项,则会导致功能非常不一致。)

相关内容