|-转 install-casaos.sh: line 414: printf: 40.96: invalid number
Starting network speed test (max 60 s) from URL: https://github.com/IceWhaleTech/CasaOS-CLI/releases/download/v0.4.4-3-alpha1/linux-amd64-casaos-cli-v0.4.4-3-alpha1.tar.gz ? Real-time download speed will be shown below: install-casaos.sh: line 414: printf: 40.96: invalid number
Get_Network_Speed() {
local TEST_URL="${1:-https://speed.hetzner.de/100MB.bin}" # 默认为稳定测速文件,可替换
local TEMP_FILE="/tmp/speedtest_$$.bin"
local START_TIME END_TIME DURATION FILE_SIZE SIZE_MB
local MAX_TEST_TIME=60 # 最长测速时间(秒),可自行调整
local TIMEOUT_CMD="timeout $MAX_TEST_TIME"
# 清理临时文件
trap 'rm -f "$TEMP_FILE"' EXIT
echo "⏬ Starting network speed test (max $MAX_TEST_TIME s) from URL: $TEST_URL"
echo "? Real-time download speed will be shown below:"
START_TIME=$(date +%s.%N)
# 后台启动 wget 下载
$TIMEOUT_CMD wget -q --show-progress=no -O "$TEMP_FILE" "$TEST_URL" >/dev/null 2>&1 &
local WGET_PID=$!
local PREV_SIZE=0
local PREV_TIME=$START_TIME
local SPEED_UPDATE_INTERVAL=1 # 每隔1秒更新一次速度显示
# === 实时监测下载速度 ===
while kill -0 "$WGET_PID" 2>/dev/null; do
sleep $SPEED_UPDATE_INTERVAL
local CURRENT_TIME=$(date +%s.%N)
local CURRENT_SIZE=$(wc -c < "$TEMP_FILE" 2>/dev/null || echo 0)
local ELAPSED=$(echo "$CURRENT_TIME - $PREV_TIME" | bc -l)
if (( $(echo "$ELAPSED >= $SPEED_UPDATE_INTERVAL" | bc -l) )) && [ "$(echo "$ELAPSED > 0" | bc -l)" -eq 1 ]; then
local DIFF_SIZE=$((CURRENT_SIZE - PREV_SIZE))
if [ "$DIFF_SIZE" -gt 0 ]; then
local SIZE_MB=$(echo "scale=2; $DIFF_SIZE / 1048576" | bc -l)
local SPEED_MB_S=$(echo "scale=2; $SIZE_MB / $ELAPSED" | bc -l)
local SPEED_KB_S=$(echo "scale=0; $SPEED_MB_S * 1024" | bc -l)
# 动态刷新当前速度(带单位,自动选择 MB/s 或 KB/s 更直观)
if (( $(echo "$SPEED_MB_S >= 0.1" | bc -l) )); then
printf "\r? Current Speed: %.2f MB/s" "$SPEED_MB_S"
else
printf "\r? Current Speed: %d KB/s" "$SPEED_KB_S"
fi
fi
PREV_SIZE=$CURRENT_SIZE
PREV_TIME=$CURRENT_TIME
fi
done
# 等待 wget 进程结束(可能是被 timeout 中断的)
wait "$WGET_PID" 2>/dev/null || true
END_TIME=$(date +%s.%N)
DURATION=$(echo "$END_TIME - $START_TIME" | bc -l)
# 避免除零
if (( $(echo "$DURATION <= 0" | bc -l) )); then
DURATION=0.1
fi
FILE_SIZE=$(wc -c < "$TEMP_FILE" 2>/dev/null || echo 0)
if [ "$FILE_SIZE" -eq 0 ]; then
echo -e "
❌ ❗ No data downloaded or download failed."
return 1
else
SIZE_MB=$(echo "scale=2; $FILE_SIZE / 1048576" | bc -l)
DOWNLOAD_SPEED_MB_S=$(echo "scale=2; $SIZE_MB / $DURATION" | bc -l)
# 最终结果输出
local FORMATTED_AVG=$(printf "%.2f" "$DOWNLOAD_SPEED_MB_S")
echo -e "
✅ Downloaded $(printf "%.2f" "$SIZE_MB") MB in $(printf "%.2f" "$DURATION") s → Avg Speed: ${FORMATTED_AVG} MB/s"
fi
return 0
}
20250922 1133
你遇到的错误:
```
install-casaos.sh: line 414: printf: 40.96: invalid number
```
是因为 **`printf` 在某些 shell 环境(尤其是 `dash` 或严格模式下的 `bash`)中不支持浮点数格式化为参数**。虽然 `%.2f` 是合法的格式符,但当你把一个浮点数(如 `40.96`)作为参数传给 `printf` 时,某些 `printf` 实现会报错,因为它期望整数。
此外,在你的代码中:
```bash
printf "\r? Current Speed: %.2f MB/s" "$SPEED_MB_S"
```
和
```bash
printf "%.2f" "$DOWNLOAD_SPEED_MB_S"
```
都可能触发这个错误,特别是在使用了 `busybox` 版本或非 GNU 环境的系统上。
---
### ✅ 解决方案:改用 `awk` 进行浮点数格式化
`awk` 是处理浮点运算和格式化的可靠工具,不受 `printf` 内建限制影响。
---
### ✅ 修改后的函数(已修复)
Get_Network_Speed() {
local TEST_URL="${1:-https://speed.hetzner.de/100MB.bin}"
local TEMP_FILE="/tmp/speedtest_$$.bin"
local MAX_TEST_TIME=60
local TIMEOUT_CMD="timeout $MAX_TEST_TIME"
# 清理临时文件
trap 'rm -f "$TEMP_FILE"' EXIT
echo "⏬ Starting network speed test (max $MAX_TEST_TIME s) from URL: $TEST_URL"
echo "? Real-time download speed will be shown below:"
local START_TIME=$(date +%s.%N)
# 启动下载
$TIMEOUT_CMD wget -q --show-progress=no -O "$TEMP_FILE" "$TEST_URL" >/dev/null 2>&1 &
local WGET_PID=$!
local PREV_SIZE=0
local PREV_TIME=$START_TIME
local SPEED_UPDATE_INTERVAL=1
# === 实时监测速度 ===
while kill -0 "$WGET_PID" 2>/dev/null; do
sleep $SPEED_UPDATE_INTERVAL
local CURRENT_TIME=$(date +%s.%N)
local CURRENT_SIZE=$(wc -c < "$TEMP_FILE" 2>/dev/null || echo 0)
local ELAPSED=$(echo "$CURRENT_TIME - $PREV_TIME" | bc -l)
if (( $(echo "$ELAPSED >= $SPEED_UPDATE_INTERVAL" | bc -l) )) && [ "$(echo "$ELAPSED > 0" | bc -l)" -eq 1 ]; then
local DIFF_SIZE=$((CURRENT_SIZE - PREV_SIZE))
if [ "$DIFF_SIZE" -gt 0 ]; then
local SIZE_MB=$(echo "scale=2; $DIFF_SIZE / 1048576" | bc -l)
local SPEED_MB_S=$(echo "scale=3; $SIZE_MB / $ELAPSED" | bc -l)
# 使用 awk 格式化输出,避免 printf 浮点错误
if (( $(echo "$SPEED_MB_S >= 0.1" | bc -l) )); then
printf "\r? Current Speed: %s MB/s" "$(echo "$SPEED_MB_S" | awk '{printf "%.2f", $1}')"
else
local SPEED_KB_S=$(echo "$SPEED_MB_S * 1024" | bc -l)
printf "\r? Current Speed: %s KB/s" "$(echo "$SPEED_KB_S" | awk '{printf "%.0f", $1}')"
fi
fi
PREV_SIZE=$CURRENT_SIZE
PREV_TIME=$CURRENT_TIME
fi
done
wait "$WGET_PID" 2>/dev/null || true
local END_TIME=$(date +%s.%N)
local DURATION=$(echo "$END_TIME - $START_TIME" | bc -l)
# 防止除零
if (( $(echo "$DURATION <= 0.01" | bc -l) )); then
DURATION=0.1
fi
local FILE_SIZE=$(wc -c < "$TEMP_FILE" 2>/dev/null || echo 0)
if [ "$FILE_SIZE" -eq 0 ]; then
echo -e "\n❌ ❗ No data downloaded or download failed."
return 1
else
local SIZE_MB=$(echo "scale=2; $FILE_SIZE / 1048576" | bc -l)
local AVG_SPEED=$(echo "scale=3; $SIZE_MB / $DURATION" | bc -l)
# 最终结果也用 awk 格式化
local FORMATTED_SIZE=$(echo "$SIZE_MB" | awk '{printf "%.2f", $1}')
local FORMATTED_DURATION=$(echo "$DURATION" | awk '{printf "%.2f", $1}')
local FORMATTED_AVG=$(echo "$AVG_SPEED" | awk '{printf "%.2f", $1}')
echo -e "\n✅ Downloaded ${FORMATTED_SIZE} MB in ${FORMATTED_DURATION} s → Avg Speed: ${FORMATTED_AVG} MB/s"
fi
return 0
}
### ✅ 主要修改点说明: ...
浏览更多内容请先登录。
立即注册
更新于:2025-09-22 11:36:12
相关内容
linux vim中不小心按了#号,结果printf就变成这个颜色了,怎么给变回来啊,求...
Chrome浏览器:The request client is not a secure context and the reso...
mysqli的基本使用
Linux的工具应用
ubuntu24.04 最好的输入法是什么?
Windows的压缩卷或者叫磁盘分区Resize的工具MiniTool
让ubuntu更像Windows
视频播放器
GParted - linux下的硬盘 resize工具。不用重新安装系统。
elementary OS 8.0.1 和Nitrux OS 的磁力链接,manjaro 的官网,feren ...
列出所有在维护的Linux Desktop
exFAT 我去看看,走先,去win11了
在Linux上使用像微软拼音一样好用的输入法
国外的linux用户是如何平替windows的那些软件的
python and shell
为什么使用副 shell 脚本生成 Python 文件
推荐内容