|-转 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下查看服务器配置的命令
Linux上安装rz和sz命令 yum -y install lrzsz
用tcping检查网站开放的端口-TCPING小工具的使用和下载
Windows下查看mysql是否启动
怎么查看Windows的启动分区是哪一个分区呢?
Linux操作系统安装
Ubuntu 25.04 (Plucky Puffin) Desktop安装
linux下多系统安装包括之前安装的Windows如何正确安装,保证多启动时多系统。
关于ESP分区的挂载和备份中要注意的事项
Linux下磁盘健康检查用的命令sudo smartctl -a /dev/sdd
运行一次短时间的硬盘自检 sudo smartctl -t short /dev/sdd
如何在Linux里用命令查看主版BIOS的boot启动项都有哪些
修复WINDOWS启动报错
修复WINDOWS启动报错之二
修复WINDOWS启动报错之三
linux不通过商店安装vs code
linux desktop 现在运行速度最快的几个,并发下网址
基于Arch,带桌面的,最受欢迎的是
最受欢迎的Linux系统
linux系统安装涉及的命令
Linux操作系统安装之二
linux自己系统盘上的文件夹,快捷方式也要这么建立吗
Linux服务器安装桌面环境并搭建VNC服务器
rsync 命令复制文件,遇到的问题
Winux操作系统安装
Linux下备份ESP分区
peppermint os install error /usr/sbin/bootloader-config
install linux peppermint os
install linux peppermint os 2
基于debian操作系统,有哪些做的比较好的操作系统介绍出来,然后发链接
未访问到的网址
linux系统使用swap交换分区,多个系统共用(安装了多个系统,每次只启动一个系统)
Linux常用命令
linux desktop 安装各种常用工具和应用
休眠(Hibernate)功能在 Linux 系统中
Linux操作系统安装之三
“您的连接不是私密连接”,错误代码 NET::ERR_CERT_AUTHORITY...
如何在 Linux 桌面和应用菜单添加 Rhythmbox 快捷方式
基于Linux Debian的操作系统,一些常见的没列出
conda init 命令需要指定 shell 类型,因为不同的 shell 有不同的配置文件和语法
Airsonic/Subsonic 带界面的本地客户端
服务器安装 navidrome 线上音乐管理工具
termius-app ssh客户端新一代工具
FSearch是 Everything 的理想替代工具
美观又响应快的linux都例举出来,要支持EFI启动的,发网址,能列多少列多少,...
curl -o -L "http...."
获取linux安装的包名,Ubuntu和Debian系列
E: Package 'netcat' has no installation candidate [错误] 安装 SSL...
linux面板被锁解决办法。
在安装liunx服务器时,本地电脑上用到各种工具和方法
LInux系统 NTFS分区挂载异常问题总结 Error mounting /dev/sdd7 at /medi...
推荐内容