1

Все еще изучаю скрипты bash ...

У меня есть функция, которая изменяет размеры изображений и рассчитывает, сколько масштабировать его на основе размера файла. Мне нужно передать этот процент в качестве аргумента для команды convert, но я не могу удалить возврат из конца строки.

Когда я запускаю функцию, я получаю:

2.362413
%

Как я могу объединить их в одной строке без возврата или символа новой строки? Трубопровод к tr с помощью '\r' или '\d', похоже, не работает.

 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
 }

Также любые другие советы будут оценены!

2 ответа2

0

В коде есть несколько странных строк.

Например:

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

Это присваивает строку "echo" в $ PRODUCT и запускает ${PRODUCT} | tr -d '\r' с предыдущим значением $ PRODUCT.

Что вам нужно, это подстановка команд:

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

Я принял другой подход к улучшению ... Не нужно пускать трубу в tr , а просто сделать «%» частью вывода. Затем, поскольку все операторы if elsif были сложными, но выполняли одни и те же команды, я упростил их до одного оператора 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
}

Переменная TARGET теперь немного более запутанная, но я хотел продемонстрировать альтернативу вашей команде bc. Awk делает математику, и может форматировать вывод тоже.

Чтобы разбить его, в awk передается постоянное значение 35000000 (это число было 350000, но я умножил на 100, чтобы преобразовать десятичное число в проценты) и отслеживает это поле / значение как «$ 1». Поскольку $ sz не определен или не установлен внутри самого awk, мы вырываемся из awk, закрывая одинарную кавычку и достигая предыдущего уровня функции, чтобы получить значение $ sz. Затем мы заканчиваем этот вызов, снова запуская наши одинарные кавычки. Со всей организованной математикой мы печатаем результат, включая добавленный знак процента.

Без знака процента десятичное число должно двигаться снова.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .