Shell脚本调用jq报错:return需数值参数,求JSON字段获取方案
问题分析与解决
你遇到的错误 sample.sh: line 5: return: null: numeric argument required,根源有三个:
- shell函数
return用法错误:return只能返回0-255的整数状态码,用来表示函数执行结果的状态,不能用来返回JSON内容这类数据。 - jq变量引用未生效:单引号包裹的jq表达式
'."$1"'里,$1不会被shell解析为函数的第一个参数,jq会把$1当成JSON的key去查找,自然找不到对应值,返回null,这就是错误里null的来源。 - 参数传递未加引号:调用
getHeader "content-length" $RESPONSE时,$RESPONSE没加双引号,shell会把JSON按空格拆分,函数拿到的$2只是不完整的JSON片段,jq无法正常处理。
修正后的脚本
#!/bin/bash function getHeader() { # 用jq的--arg传递shell变量,避免引号解析问题 jq --arg key "$1" '.[$key]' <<< "$2" } RESPONSE='{"content-length":"2","address":"10.244.3.1:37930","path":"/hello-world"}' echo "$RESPONSE" | jq '.' # 给$RESPONSE加双引号,保证完整JSON作为单个参数传递 x_header=$(getHeader "content-length" "$RESPONSE") # 验证结果 echo "x_header的值:$x_header"
关键修正点说明
- 移除
return,直接让jq输出结果,通过$(...)捕获到变量中,这是shell函数返回数据的正确方式。 - 使用jq的
--arg参数将shell变量传递给jq,在jq表达式中用[$key]引用变量,确保能正确匹配JSON的key。 - 调用函数时给
$RESPONSE加双引号,避免JSON被shell拆分成多个参数。
内容的提问来源于stack exchange,提问作者prasanth
相关产品推荐
相关产品推荐

