You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gutenberg图书下载量自动统计Bash脚本报错排查求助

问题描述

需要编写Bash脚本自动获取古腾堡图书库(Project Gutenberg)图书的下载量:传入BookId时,创建对应ID的目录,在目录下以图书标题(空格替换为下划线)命名文件,追加写入YYYY-MM-DD:下载量格式的记录。以下是编写的脚本及执行报错,需排查解决。

原脚本

#!/bin/bash

# Check if Book IDs are provided as arguments
if [ "$#" -eq 0 ]; then
    echo "Usage: $0 <BookId1> [<BookId2> <BookId3> ...]"
    exit 1
fi

# Base URL for Gutendex API
BASE_URL="http://gutendex.com/books/?ids="

# Get today's date in the format YYYY-MM-DD
TODAY=$(date +%Y-%m-%d)

# Loop through each provided Book ID and process them
for bookId in "$@"; do
    # Call the Gutendex API with the provided Book ID(s)
    response=$(curl -s "$BASE_URL$bookId")

    # Extract download count from the JSON response using jq
    downloadCount=$(echo "$response" | jq -r '.[].download_count')

    # Create directory if it doesn't exist
    if [ ! -d "$bookId" ]; then
        mkdir "$bookId"
    fi

    # Extract book title from the JSON response using jq and replace spaces with underscores
    bookTitle=$(echo "$response" | jq -r '.[].title' | tr ' ' '_')

    # Create or append to a file with today's date and download count
    echo "$TODAY:$downloadCount" >> "$bookId/$bookTitle"

    echo "Download count for Book ID $bookId has been recorded in $bookId/$bookTitle"
done

执行报错

./Quiz_Review.sh 12 1 14
jq: error (at <stdin>:1): Cannot index number with string "download_count"
jq: error (at <stdin>:1): Cannot index number with string "title"
./Quiz_Review.sh: line 32: 12/: Is a directory
Download count for Book ID 12 has been recorded in 12/
jq: error (at <stdin>:1): Cannot index number with string "download_count"
jq: error (at <stdin>:1): Cannot index number with string "title"
./Quiz_Review.sh: line 32: 1/: Is a directory
Download count for Book ID 1 has been recorded in 1/
jq: error (at <stdin>:1): Cannot index number with string "download_count"
jq: error (at <stdin>:1): Cannot index number with string "title"
./Quiz_Review.sh: line 32: 14/: Is a directory
Download count for Book ID 14 has been recorded in 14/

错误原因

  1. JSON路径错误:Gutendex API返回的JSON结构外层包含results数组,图书数据都在results[0]下。原脚本用.[].download_count会遍历顶层所有键(比如count是数字类型),导致jq无法用字符串索引数字,抛出错误。
  2. 文件名为空:由于jq提取标题失败,bookTitle为空,写入文件时路径变成12/(目录),因此提示“Is a directory”。

修正后的脚本

#!/bin/bash

# 检查是否传入Book ID参数
if [ "$#" -eq 0 ]; then
    echo "用法: $0 <BookId1> [<BookId2> <BookId3> ...]"
    exit 1
fi

# Gutendex API基础地址
BASE_URL="http://gutendex.com/books/?ids="

# 获取今日日期(YYYY-MM-DD格式)
TODAY=$(date +%Y-%m-%d)

# 遍历每个Book ID处理
for bookId in "$@"; do
    # 调用API获取响应
    response=$(curl -s "$BASE_URL$bookId")

    # 从JSON响应中提取下载量(修正路径为results[0])
    downloadCount=$(echo "$response" | jq -r '.results[0].download_count')
    # 提取图书标题并替换空格、斜杠为下划线(避免文件名非法字符)
    bookTitle=$(echo "$response" | jq -r '.results[0].title' | tr -s ' /\\' '_')

    # 检查提取是否成功
    if [ "$downloadCount" = "null" ] || [ -z "$bookTitle" ]; then
        echo "警告: 无法获取Book ID $bookId的有效数据,跳过处理"
        continue
    fi

    # 创建Book ID目录(不存在则创建)
    mkdir -p "$bookId"

    # 追加写入记录到对应文件
    echo "$TODAY:$downloadCount" >> "$bookId/$bookTitle"

    echo "Book ID $bookId的下载量已记录到 $bookId/$bookTitle"
done

关键修改点

  • 修正jq提取路径为.results[0].download_count和.results[0].title,匹配API返回的JSON结构
  • 增强标题处理:用tr -s ' /\\' '_'替换空格、斜杠、反斜杠为下划线,避免非法文件名
  • 添加数据有效性检查:如果下载量为null或标题为空,跳过当前Book ID处理,避免无效写入
  • 用mkdir -p替代if [ ! -d ],更简洁地创建目录(已存在则不报错)

内容的提问来源于stack exchange,提问作者Dan Malengela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:20:18