Bash 脚本,删除变量中的换行符

Bash 脚本,删除变量中的换行符

仍在掌握 bash 脚本...

我有一个函数可以调整图像大小并根据文件大小计算缩放比例。我需要将此百分比作为参数传递给 convert 命令,但我无法从字符串末尾删除返回。

当我运行该函数时,我得到:

2.362413
%

我怎样才能将它们连接到一行而不用回车符或换行符?使用 '\r' 或 '\d' 管道传输到 tr 似乎不起作用。

 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
 }

如果有任何其他建议我们将不胜感激!

答案1

代码中有几行奇怪的内容。

例如:

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%

答案2

我采取了不同的改进方法......没有管道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 的值。然后我们通过再次启动单引号来结束该调用。整理好所有数学运算后,我们打印结果,包括附加的百分号。

如果没有百分号,小数点就得再次移动。

相关内容