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/
错误原因
- JSON路径错误:Gutendex API返回的JSON结构外层包含
results数组,图书数据都在results[0]下。原脚本用.[].download_count会遍历顶层所有键(比如count是数字类型),导致jq无法用字符串索引数字,抛出错误。 - 文件名为空:由于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
相关产品推荐
相关产品推荐

