仍在掌握 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 的值。然后我们通过再次启动单引号来结束该调用。整理好所有数学运算后,我们打印结果,包括附加的百分号。
如果没有百分号,小数点就得再次移动。