FILE=$(basename "${1/%.jpeg/.jpg}")
funcionou para mim.
teste:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
conteúdo do script:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Existe alguma maneira de colar essas duas linhas juntas em uma única linha?
Você não pode aninhar expansões no bash (nem em ksh, ash e outros shells além do zsh). Essa é apenas uma limitação cosmética, já que, conforme você ilustra, você pode atribuir uma expressão intermediária a uma variável temporária. É um pouco irritante para os one-liners, mas nos scripts é indiscutivelmente melhor para a legibilidade.
Você pode evitar usar o utilitário externo basename
e usar uma construção de manipulação de string:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aqui, acontece que você pode reescrever seu script para colocar a substituição do comando do lado de fora . Isso não é um fenômeno geral, nem você ganha nada além de um certo sentimento de uma linha.
Zsh, para melhor ou para pior, deixa você aninhar expansões:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Ou você pode usar a construção incorporada do zsh em vez de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Eu preferiria:
FILE=$(basename $1 .jpeg).jpg
O segundo parâmetro para basename é um sufixo a ser removido do nome do arquivo (veja man basename
)
Você pode usar um único comando sed
da seguinte forma:
FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
Incorporando sed
, isso deve funcionar:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Isso não responde exatamente à sua pergunta porque não posso; não tenho certeza se é possível.)
As construções de Bash ${}
funcionam com nomes de variáveis , portanto não há como incorporar um comando diretamente. A abordagem do @ sr_ é uma alternativa se você não se importar com o garfo extra.
A linha
FILE=$(basename "${1/%.jpeg/.jpg}")
pode ser encurtado e tornar-se mais portátil com
FILE=$(basename "${1%.jpeg}.jpg")
Tags bash shell shell-script string