Сценарий Bash, чередование символов новой строки в переменной

все еще получает навык сценариев bash...

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

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

2.362413
%

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

 shrinkImg() {
   FILENAME=$(basename "")
   EXTENSION="${FILENAME##*.}"
   sz=$(stat -c '%s' )
   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  -resize $TARGET 
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'PNG' ] ; then
     convert  -resize $TARGET  
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'jpg' ] ; then
     convert  -resize $TARGET 
   elif [ $sz -ge 350000 ] && [ $EXTENSION == 'JPG' ] ; then
     convert  -resize $TARGET 
   fi
 }

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

4
задан ddmd
16.11.2022 2:21 Количество просмотров материала 2499
Распечатать страницу

2 ответа

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

например:

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

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

что нужно команду:

filename=${1##*/}
extension=${filename##*.}
sz=$(stat -c %s "")
product=$(bc <<< "scale = 10; ( 100 / ( $sz / 350000))")
echo $product%
0
отвечен choroba 2022-11-17 10:09

Я взял другой подход к улучшению... Нет трубопроводов для tr, и как раз делающ " % " часть выхода. Тогда с тех пор все if elsif операторы были сложными, но выполняя те же команды, я упростил их в один case заявление.

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

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

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

без знака процента, десятичной и снова двигаться.

0
отвечен Daniel Liston 2022-11-17 12:26

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх