如何在调用WDQS的Shell脚本中验证Wikimedia语言代码有效性?
当然可以实现这个验证!既然你的脚本已经在和WDQS打交道,咱们可以直接利用Wikidata本身的数据来验证语言代码的有效性,或者也可以预存一份语言代码列表做离线验证,下面给你两种实用方案:
方案1:实时通过WDQS验证语言代码
这种方法不需要维护本地列表,直接用SPARQL查询Wikidata获取所有维基媒体认可的语言代码,然后检查输入是否在结果中,能保证数据的实时准确性。
#!/bin/bash # 检查用户是否传入语言代码参数 if [ $# -ne 1 ]; then echo "用法: $0 <语言代码>" exit 1 fi # 统一转小写,避免大小写不匹配的问题 INPUT_LANG=$(echo "$1" | tr '[:upper:]' '[:lower:]') # 构造SPARQL查询:获取所有维基媒体语言代码实例的ISO 639-1代码 SPARQL_QUERY='SELECT ?langCode WHERE { ?item wdt:P31 wd:Q188551 . # 筛选"维基媒体语言代码"类型的条目 ?item wdt:P218 ?langCode . # 提取语言代码属性值(对应目标页面第一列) }' # 调用WDQS接口,获取TSV格式的结果并跳过表头 VALID_LANGS=$(curl -s -G "https://query.wikidata.org/sparql" \ --data-urlencode "query=$SPARQL_QUERY" \ --data-urlencode "format=tsv" | tail -n +2) # 检查输入的语言代码是否在有效列表中 if echo "$VALID_LANGS" | grep -q "^$INPUT_LANG$"; then echo "语言代码 '$INPUT_LANG' 是有效的维基媒体语言代码" # 这里继续执行你的WDQS查询逻辑 else echo "错误: 语言代码 '$INPUT_LANG' 无效" exit 1 fi
关键细节说明:
- 转小写处理:维基媒体的语言代码都是小写格式,避免用户输入大写/混合大小写导致验证失败
- SPARQL查询逻辑:直接关联Wikidata中标记为「维基媒体语言代码」(Q188551)的条目,提取其ISO 639-1代码(P218),和目标页面的第一列数据完全对应
- 精确匹配:用
^$包裹匹配规则,避免出现类似en匹配en-US的误判情况
方案2:离线验证(预存语言代码列表)
如果你的脚本需要频繁调用,不想每次都请求WDQS,可以先把有效语言代码下载到本地文件,用本地列表做验证,提升脚本执行效率。
步骤1:提前下载语言代码列表
curl -s -G "https://query.wikidata.org/sparql" \ --data-urlencode "query=SELECT ?langCode WHERE { ?item wdt:P31 wd:Q188551 . ?item wdt:P218 ?langCode . }" \ --data-urlencode "format=tsv" | tail -n +2 > valid_wikimedia_langs.txt
步骤2:脚本中用本地列表验证
#!/bin/bash if [ $# -ne 1 ]; then echo "用法: $0 <语言代码>" exit 1 fi INPUT_LANG=$(echo "$1" | tr '[:upper:]' '[:lower:]') VALID_LANG_FILE="valid_wikimedia_langs.txt" # 检查本地列表文件是否存在 if [ ! -f "$VALID_LANG_FILE" ]; then echo "错误: 有效语言代码文件 $VALID_LANG_FILE 不存在,请先执行下载命令" exit 1 fi # 验证输入的语言代码 if grep -q "^$INPUT_LANG$" "$VALID_LANG_FILE"; then echo "语言代码 '$INPUT_LANG' 是有效的维基媒体语言代码" # 执行你的WDQS查询逻辑 else echo "错误: 语言代码 '$INPUT_LANG' 无效" exit 1 fi
额外提示:
- 如果需要支持ISO 639-2/3等其他类型的语言代码,可以修改SPARQL查询,加入对应的属性(比如P219、P220)
- 可以给curl添加
--max-time 10参数,避免网络超时导致脚本卡住
内容的提问来源于stack exchange,提问作者Sasidhar
相关产品推荐
相关产品推荐

