então estou tentando selecionar um intervalo de arquivos usando um script interativo.
O objetivo final é usar o read
comando, mas para demonstração aqui atribuí a glob
variável manualmente
#!/bin/bash
shopt -s extglob
# read -rp "Please enter a globbing string:"$'\n' glob
# This will give me an error (See below)
glob=*2020_04_03_{06..18}.jpg
/bin/ls -la /mnt/drive1/images/*/*/${glob}
# While this will return the desired files
/bin/ls -la /mnt/drive1/images/*/*/*2020_04_03_{06..18}.jpg
O erro é o seguinte:
Error /bin/ls: cannot access "/mnt/drive1/images/*/*/*2020_04_03_{06..18}.jpg": No such file or directory
Então, o que estou perdendo aqui ao atribuir a glob
variável ou anexar a glob
variável ao meu caminho?
Solução:
Encontrei uma solução, mas não sei bem por que, mas
bash <<EOF
/bin/ls -la /mnt/drive1/images/*/*/${glob}
EOF
me dará a saída desejada.
Responder1
Você pode usar uma atribuição de array em vez de apenas uma variável.
shopt -s nullglob ##: just in case there is non match for the glob.
glob=(*2020_04_03_{06..18}.jpg) ##: This will expand the glob * and brace expansion.
/bin/ls -la /mnt/drive1/images/*/*/"${glob[@]}"
Isso deve funcionar para o seu código de exemplo.
O problema surgirá quando você decidir substituir os números dentro da expansão da chave por uma variável que foi mencionada por @kusalananda, sobre a sequência de expansão.
Adicione a
failglob
opção shell se quiser ver um erro e saia com um valor diferente de zero se não houver nenhum padrão correspondente.