Quero remover todos os pontos negativos duplicados de uma string usando bash puro (sem sed/awk/etc). Isso funciona muito bem na CLI:
s="com---strig-3-1080p-----mp4"
echo "${s//+(-)/-}"
com-strig-3-1080p-mp4 # output
Quando faço o mesmo em um script, não funciona:
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
Agora teste:
sanitize.sh "com---strig-3-1080p-----mp4"
1 com---strig-3-1080p-----mp4
2 com---strig-3-1080p-----mp4
O que estou fazendo de errado?
A disponibilidade
+(...)
do Bash geralmente depende se aextglob
opção shell está habilitada. Existem algumas exceções, por exemplo, o lado direito das[[
comparações de strings sempre pode usar extglobs, mas${x/y/z}
as substituições de strings não são uma dessas exceções. Você precisa ativar a opção usando:Você precisará fazer isso próximo ao topo do seu script. (Como os scripts de shell são executados em seus próprios processos separados do seu shell interativo, todos eles têm seus próprios conjuntos de "opções habilitadas" e não podem herdá-los do shell interativo... e isso faria com que as coisas funcionassem de maneira muito inconsistente se funcionassem.)