jq 1.5多个bash变量作为参数

jq 1.5多个bash变量作为参数,sh,posix,jq,Sh,Posix,Jq,我正在为我的openwrt编写一个脚本,它是我pia连接的看门狗。我正在尝试制作这个小jq过滤器,但每次尝试都会出错 我有更多的选择,我“组成”jq过滤器 all_region_data=$(curl -s "https://serverlist.piaservers.net/vpninfo/servers/v4" | head -1) BestRegion="italy" jq_filter='.regions[]' if [ -z "$B

我正在为我的openwrt编写一个脚本,它是我pia连接的看门狗。我正在尝试制作这个小jq过滤器,但每次尝试都会出错 我有更多的选择,我“组成”jq过滤器

all_region_data=$(curl -s "https://serverlist.piaservers.net/vpninfo/servers/v4" | head -1)
BestRegion="italy"

jq_filter='.regions[]'

if [ -z "$BestRegion" ]; then # BestRegion not forced
    if [ "$pia_pf" = "true" ]; then
        jq_filter="${jq_filter} | select(.port_forward==true)"
    fi

    if [ "$pia_no_geo" = "false" ]; then
        jq_filter="${jq_filter} | select(.geo==false)"
    fi

    if [ "$pia_no_geo" = "true" ]; then
        jq_filter="${jq_filter} | select(.geo==true)"
    fi

    jq_filter="${jq_filter} | .servers.meta[0].ip+\" \"+.id+\" \"+.name+\" \"+(.geo|tostring)"

    summarized_region_data=$(echo "$all_region_data" | jq -r "${jq_filter}")

    best_region # function to extract best_region

    if [ -z "$BestRegion" ]; then
        log "..."
        log "No region responded within ${max_latency}s, consider using a higher timeout."
        rm -rf "$wg_script_lock_file"
        return
    fi
else # BestRegion forced
    if [ "$pia_pf" = "true" ]; then
        jq_filter="${jq_filter} | select(.port_forward==true)"
    fi

    if [ "$pia_no_geo" = "false" ]; then
        jq_filter="${jq_filter} | select(.geo==false)"
    fi

    if [ "$pia_no_geo" = "true" ]; then
        jq_filter="${jq_filter} | select(.geo==true)"
    fi
fi
第一个
如果循环
工作,则该函数执行脏工作。但是我想有机会“强制”使用
BestRegion
,所以我创建了
else循环。我有问题了

这就是我想做的

echo $all_region_data | jq --arg REGION_ID "$BestRegion" --arg JQ_FILTER "$jq_filter" -r '$JQ_FILTER | select(.id==$REGION_ID)'
我不能使用这两个
var
,我得到了这个错误

jq: error (at <stdin>:1): Cannot index string with string "id"
jq:error(at:1):无法索引字符串为“id”的字符串

你会怎么做?

如果我理解正确,你需要帮助的问题是:

您有一个shell变量
$jq_filter
,其中包含jq filter的文本。您有一个shell变量
$BestRegion
,它包含纯文本字符串。您希望将前者作为更大的JQ过滤器的一部分传入,而将后者作为JQ变量传入

尝试:


具体来说,您希望shell在将其传递给jq之前展开
$jq\u filter
,因此将其放在双引号中,但希望jq处理
$REGION\u ID
,因此将其放在单引号中。请注意,双引号和单引号之间没有空格-这确保了shell将两个字符串作为JQ的一个参数组合在一起。

如果我理解正确,您需要帮助的问题是:

您有一个shell变量
$jq_filter
,其中包含jq filter的文本。您有一个shell变量
$BestRegion
,它包含纯文本字符串。您希望将前者作为更大的JQ过滤器的一部分传入,而将后者作为JQ变量传入

尝试:


具体来说,您希望shell在将其传递给jq之前展开
$jq\u filter
,因此将其放在双引号中,但希望jq处理
$REGION\u ID
,因此将其放在单引号中。请注意,双引号和单引号之间没有空格-这确保shell将两个字符串组合在一起作为JQ的一个参数。

调用
JQ--arg REGION_ID“$BestRegion”--arg JQ_FILTER“$JQ_FILTER”-r$JQ_FILTER | select(.ID=$REGION_ID)
相当混乱。请密切注意shell变量和jq变量之间的区别。不要忘记,如果在shell中设置X=.a,那么
jq--arg X“$X”'$X'
将打印JSON字符串
”。a“
我可以对变量进行重新排序,以便第一个
arg
是jq\u过滤器,第二个是region\u id。我还可以更改变量名称以确保不会出错。如果我只使用一个
arg
,则所有操作都有效,但我需要两个。我需要一个非JSON输出,所以我在jq中使用了
-r
选项,我认为这是正确的。我想问题出在
上,但我不知道如何处理这个问题,我尝试了许多没有运气的变体调用
jq--arg REGION\u ID“$BestRegion”-arg jq\u FILTER“$jq\u FILTER”-r$jq\u FILTER | select(.ID=$REGION\u ID)“
相当混乱。请密切注意shell变量和jq变量之间的区别。不要忘记,如果在shell中设置X=.a,那么
jq--arg X“$X”'$X'
将打印JSON字符串
”“
我可以对变量重新排序,以使第一个
arg
jq\u过滤器和第二个区域\u id。我还可以更改变量名称,以确保不会出错。如果我只使用一个
arg
,则所有操作都有效,但我需要两个。我需要一个非JSON输出,所以我在jq中使用了
-r
选项,我认为这是正确的。我想问题出在
上,但我不知道如何处理这个问题,我尝试了很多变体,但没有运气,在我的bash脚本中,我想传递两个变量,jq\u filter,它包含“构建”的整个过滤器“来自包含纯文本的各种选项和最佳区域。我的第一个想法是通过2 arg,但我有扩展问题。如果需要,我可以修改变量的单引号/双引号,但我会尝试这样做。是的,在我的bash脚本中,我想传递两个变量,jq_过滤器,它包含从各种选项“构建”的整个过滤器,以及包含纯文本的BestRegion。我的第一个想法是通过2 arg,但我有扩展问题。如果需要,我可以修改变量的单引号/双引号,但我会试试这个
jq --arg REGION_ID "$BestRegion" "$jq_filter"'| select(.id==$REGION_ID)'