Bash Script, Distribuindo os caracteres da nova linha na variável

1

Ainda pegando o jeito do script do bash ...

Eu tenho uma função que redimensiona imagens e calcula quanto dimensionar com base no tamanho do arquivo. Eu preciso passar essa porcentagem como um argumento para o comando convert, mas não posso remover o retorno do final da string.

Quando executo a função, obtenho:

2.362413
%

Como posso concatenar esses itens em uma linha sem um caractere de retorno ou de nova linha? Piping to tr com '\ r' ou '\ d' não parece funcionar.

 shrinkImg() {
   FILENAME=$(basename "$1")
   EXTENSION="${FILENAME##*.}"
   sz=$(stat -c '%s' $1)
   PRODUCT=echo bc <<< "scale = 10; ( 100 / ( $sz / 350000))"; 
   PRODUCT=echo ${PRODUCT} | tr -d '\r'
   PERCENT=%
   TARGET=echo $TARGET
   TARGET=$PRODUCT$PERCENT
   echo $TARGET;
   if [ $sz -ge 350000 ] && [ $EXTENSION == 'png' ] ; then
     convert $1 -resize $TARGET $1
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'PNG' ] ; then
     convert $1 -resize $TARGET $1 
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'jpg' ] ; then
     convert $1 -resize $TARGET $1
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'JPG' ] ; then
     convert $1 -resize $TARGET $1
   fi
 }

Além disso, qualquer outra sugestão seria apreciada!

    
por ddmd 23.05.2016 / 15:27

2 respostas

0

Existem várias linhas estranhas no código.

Por exemplo:

PRODUCT=echo ${PRODUCT} | tr -d '\r'

Isso atribui a string "echo" em $ PRODUCT e executa ${PRODUCT} | tr -d '\r' com o valor anterior de $ PRODUCT.

O que você precisa é de substituição de comandos :

filename=${1##*/}
extension=${filename##*.}
sz=$(stat -c %s "$1")
product=$(bc <<< "scale = 10; ( 100 / ( $sz / 350000))")
echo $product%
    
por 23.05.2016 / 15:37
0

Eu adotei uma abordagem diferente para melhoria ... Sem canalizar para tr e apenas fazendo a parte '%' da saída Então, como todas as instruções if elsif eram complexas, ainda executando os mesmos comandos, eu simplificou-os em uma declaração case .

shrinkImg() {
   FILENAME=$(basename "$1")
   EXTENSION="${FILENAME##*.}"
   sz=$(stat -c '%s' $1)
   TARGET=$(echo 35000000 | awk '{print $1/'$sz')"%"}')
   echo $TARGET
   if [ $sz -ge 350000 ]; then
      case $EXTENSION in
         png|PNG|jpg|JPG) convert $1 -resize $TARGET $1;;
         *) echo "Unexpected extension, $EXTENSION";;
      esac
   fi
}

A variável TARGET é um pouco mais confusa agora, mas eu queria demonstrar uma alternativa ao seu comando bc. O Awk faz a matemática e pode formatar a saída também.

Para dividi-lo, awk is é passado o valor constante de 35000000 (esse número era 350000, mas eu multipliquei por 100 para converter decimal em porcentagem) e rastreia esse campo / valor como "$ 1". Como $ sz não é definido ou configurado dentro do próprio awk, saímos do awk fechando a aspa simples e alcançando o nível anterior da função para obter o valor de $ sz. Em seguida, terminamos a chamada iniciando nossas aspas simples novamente. Com toda a matemática organizada, imprimimos o resultado incluindo um sinal de porcentagem anexado.

Sem o sinal de porcentagem, o decimal precisa se mover novamente.

    
por 10.09.2016 / 17:39