#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Existe alguma maneira de colar essas duas linhas em uma linha?
Resposta
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"
Comentários
Resposta
Você não pode” aninhar expansões em bash (nem em ksh, ash e outros shells além de zsh). Esta é apenas uma limitação cosmética, uma vez que, como você ilustra, pode atribuir uma expressão intermediária a uma variável temporária. É um pouco chato para uma linha, mas em scripts, é indiscutivelmente melhor para legibilidade.
Você poderia evitar cante o utilitário externo basename
e use uma construção de manipulação de string:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aqui, acontece que você pode reescreva 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, permite que você aninhe expansões:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Ou você pode usar a construção interna do zsh “em vez de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Resposta
Eu “daria para:
FILE=$(basename $1 .jpeg).jpg
O segundo parâmetro para o nome de base é um sufixo a ser removido do nome do arquivo (ver man basename
)
Resposta
Você pode usar um único comando sed
como o seguinte:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Resposta
Incorporando sed
, isso deve resolver:
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.)
Resposta
O Bash funcionam com nomes de variáveis , então não há como incorporar um comando diretamente. A abordagem de @sr_ “é uma alternativa se você não se importar com a bifurcação extra.
Resposta
A linha
FILE=$(basename "${1/%.jpeg/.jpg}")
pode ser reduzido e tornado mais portátil com
FILE=$(basename "${1%.jpeg}.jpg")
sed
será definitivamente necessário, eu acho.