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