我想使用纯 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
我究竟做错了什么?
Bash 中的可用性
+(...)
通常取决于是否extglob
启用 shell 选项。有一些例外,例如,字符串比较的右侧[[
始终可以使用 extglob,但${x/y/z}
字符串替换不是这些例外之一。您需要使用以下命令启用该选项:您需要在脚本顶部附近执行此操作。(由于 shell 脚本在独立于交互式 shell 的自己的进程中运行,因此它们都有自己的“启用选项”集,并且无法从交互式 shell 继承它们……如果继承的话,会使功能变得非常不一致。)