#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Existe alguma maneira de colar essas duas linhas em uma linha?
bash
shell
shell-script
string
gsklee
fonte
fonte
sed
serão definitivamente necessárias, eu acho.Você não pode aninhar expansões no bash (nem no ksh, ash e outras conchas além do zsh). Essa é apenas uma limitação cosmética, pois, como você ilustra, pode atribuir uma expressão intermediária a uma variável temporária. É um pouco chato para as falas, mas nos scripts é indiscutivelmente melhor para facilitar a leitura.
Você pode evitar o uso do utilitário externo
basename
e, em vez disso, usar uma construção de manipulação de string:Aqui, você pode reescrever seu script para colocar a substituição de comando do lado de fora . Esse não é um fenômeno geral, e você não ganha nada além de um certo sentimento de uma linha.
O Zsh, para o bem ou para o mal, permite aninhar expansões:
Ou você pode usar a construção interna do zsh em vez de
basename
:fonte
Eu iria para:
O segundo parâmetro para basename é um sufixo a ser removido do nome do arquivo (consulte
man basename
)fonte
Você pode usar um único
sed
comando como no seguinte:fonte
Incorporando
sed
, isso deve fazer o truque:(Isso não responde exatamente à sua pergunta porque não posso; não tenho certeza se é possível.)
fonte
As
${}
construções do 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 importa com o garfo extra.fonte
A linha
pode ser reduzido e tornado mais portátil com
fonte