Script di Bash, Striping di caratteri di nuova riga nella variabile


1

Sto ancora imparando da bash scripting ...

Ho una funzione che ridimensiona le immagini e calcola quanto scalare in base alla dimensione del file. Ho bisogno di passare questa percentuale come argomento al comando convert, ma non riesco a rimuovere il ritorno dalla fine della stringa.

Quando eseguo la funzione, ottengo:

2.362413
%

Come posso concatenarli su una riga senza un ritorno o un carattere di nuova riga? Piping to tr con '\ r' o '\ d' non sembra funzionare.

 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
 }

Anche altri suggerimenti sarebbero apprezzati!


Perché usare 100 / ( $sz / 350000)? Cosa c'è di sbagliato 35000000 / $sz? (A meno che, naturalmente, non si vogliano gli errori di arrotondamento aggiuntivi introdotti dalla prima formula: provare entrambi con sz=1000000.) Dovresti essere consapevole che la conversione che stai applicando ridurrà le dimensioni del file di molto più di quanto tu possa intendere (forse 100*sqrt(350000/$sz) è meglio?). Vale la pena ricordare che se si è soddisfatti dell'arrotondamento alla percentuale intera più vicina che è possibile utilizzare $((35000000/$sz)) senza usare un programma esterno. Nota anche che il filtro per rimuovere le nuove linee è tr -d '\n'no tr -d '\r'.
AFH

@ AFH, hai ragione, è molto meglio. Grazie!
ddmd

Risposte:


0

Ci sono diverse linee strane nel codice.

Per esempio:

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

Questo assegna la stringa "echo" a $ PRODUCT e viene eseguita ${PRODUCT} | tr -d '\r' con il valore precedente di $ PRODUCT.

Quello di cui hai bisogno è sostituzione di comando :

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

0

Ho adottato un approccio diverso al miglioramento ... No piping to tre facendo solo la parte '%' dell'output if elsif le affermazioni erano complesse, ma eseguendo gli stessi comandi, li ho semplificati in uno solo case dichiarazione.

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
}

La variabile TARGET ora è un po 'più confusa, ma volevo dimostrare un'alternativa al tuo comando bc. Awk fa matematica e può anche formattare l'output.

Per scomporlo, awk è passato il valore costante di 35000000 (questo numero era 350000, ma io moltiplicato per 100 per convertire il decimale in percentuale) e tiene traccia di questo campo / valore come "$ 1". Poiché $ sz non è definito o impostato dall'interno di awk stesso, interrompiamo l'awk chiudendo la virgoletta singola e raggiungendo il livello precedente della funzione per ottenere il valore di $ sz. Quindi terminiamo la chiamata iniziando di nuovo le nostre virgolette singole. Con tutta la matematica organizzata, stampiamo il risultato includendo un segno di percentuale aggiunto.

Senza il segno di percentuale, il decimale deve spostarsi nuovamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.